Winapi 将位图图像绘制到窗口中的正确方法
我有一个函数,它获取位图图像的矩形区域,将其重新缩放到不同的尺寸,并在我的对话框应用程序的窗口内的某个偏移处绘制它:Winapi 将位图图像绘制到窗口中的正确方法,winapi,mfc,gdi,stretchblt,setwindowpos,Winapi,Mfc,Gdi,Stretchblt,Setwindowpos,我有一个函数,它获取位图图像的矩形区域,将其重新缩放到不同的尺寸,并在我的对话框应用程序的窗口内的某个偏移处绘制它: void DrawImage(HANDLE hImageBitmap, CDC* pDstDC,const CRect& dstRect, CDC* pSrcDC,const CRect& srcRect) { pSrcDC->SelectObject(hImageBitmap);
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);
我有两个问题:
MoveWindow
或SetWindowPos
部分解决此问题。但我仍然可以看到他们身后的图像在闪烁。我尝试过以各种不同的方式调用SetWindowPos
,希望它能规定控件的严格Z顺序,但徒劳谢谢。我发现OnEraseBkgnd是减少绘制位图闪烁的正确位置
OnPaint
事件处理程序不应创建自己的DC来进行绘制。您应该使用CPaintDC
类。@CodyGray:谢谢。我试过了,但似乎对我不起作用。可能是因为我创建的绘制DC属于对话框本身,而不是我试图在其中绘制的窗口。您能否提供一些更具体的证据来说明“OnPaint
事件处理程序不应该创建自己的DC”的原因?谢谢。嗯……你为什么要处理一个窗口(对话框)的绘制事件,并尝试在另一个窗口上绘制?如果要在窗口上绘制,请处理该窗口的绘制事件。OnPaint
处理程序不应创建自己的DC的具体证据:该DC从不验证无效区域,保留一个WM_paint
消息流。(CPaintDC
验证其目录中的无效区域。)那么为什么不直接在对话框上绘制呢?使用WS\u CLIPCHILDREN
避免在其他控件上绘画。谢谢。图像没有覆盖整个图像窗口,因此我无法覆盖OnEraseBkgnd
回调并返回TRUE。您可以让绘制处理程序仔细擦除窗口的未覆盖区域,然后跳过WM_ERASEBKGND。这可以通过避免两次绘制像素来防止一些闪光。不过,在现代桌面合成系统中,您可能甚至没有注意到flash。