我有一个函数,它需要一个位图图像的矩形区域,将其重新缩放到不同的尺寸,并在对话框应用程序中的某个窗口内的某个偏移处绘制它:将位图图像绘制到窗口中的正确方法
void DrawImage(HANDLE hImageBitmap,
CDC* pDstDC,const CRect& dstRect,
CDC* pSrcDC,const CRect& srcRect)
{
pSrcDC->SelectObject(hImageBitmap);
pDstDC->SetStretchBltMode(HALFTONE);
pDstDC->StretchBlt
(
dstRect.left,dstRect.top,dstRect.Width(),dstRect.Height(),pSrcDC,
srcRect.left,srcRect.top,srcRect.Width(),srcRect.Height(),SRCCOPY
);
}
我使用CWnd m_cImageWindow
成员变量创建并维护该窗口。
我从对话框,对话框的OnPaint
处理程序执行图如下:
CDC* pDC = m_cImageWindow.GetDC();
CDC cDC;
cDC.CreateCompatibleDC(pDC);
CRect srcRect = ...;
CRect dstRect = ...;
DrawImage(m_hImageBitmap,pDC,dstRect,&cDC,srcRect);
cDC.DeleteDC();
m_cImageWindow.ReleaseDC(pDC);
我有两个问题:
我看到闪烁每当我改变绘图参数。解决这个问题的标准方法,从我在这里和那里读到的,是通过使用临时DC来实现双缓冲。但据我所知,这正是我已经在做的。
如果某些目标区域落在窗口之外,则会将其涂在对话框中的其他控件上。我可以通过为这些控件中的每一个调用
MoveWindow
或SetWindowPos
来部分解决此问题。但我仍然可以看到背后的图像闪烁。我曾尝试以各种不同的方式致电SetWindowPos
,希望能够控制严格的Z顺序。
谢谢。
“OnPaint”事件处理程序不应该创建自己的DC来绘制。你应该使用'CPaintDC'类。 –
@CodyGray:谢谢。我已经尝试过,但它似乎不适合我。可能是因为我创建的paint-DC属于对话框本身,而不属于我试图绘制的窗口。你能否提供一些更具体的证据来证明为什么“OnPaint'事件处理程序不应该创建它自己的DC”?谢谢。 – goodvibration
嗯...你为什么处理的一个窗口(对话)油漆事件,并试图画上一个*不同*窗口?如果你想在一个窗口上绘制,处理*该窗口的*绘制事件。 –