我有一个函数,它获取位图图像的矩形区域,将其重新缩放为不同的尺寸,并在我的对话框应用程序的窗口内的某个偏移处绘制它:
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 顺序。
谢谢你。