【发布时间】:2014-11-16 02:06:41
【问题描述】:
我试图在 MFC 对话框的顶部创建一个透明的 CWnd,以便我可以将位图 bitblt 到对话框 dc,然后分别将形状绘制到直接位于对话框顶部的透明 DC。问题是,我似乎无法让 CWnd 透明。相反,每当我将黑色位图blit 到透明的CWnd 时,它会随着对话框闪烁……就好像一个人要blit 对话框dc,然后立即将黑色位图blit 到同一个DC。
例如,在对话框中,我创建了一个 CWnd 对象,它将成为透明覆盖:
pDrawingWnd = new CWnd();
pDrawingWnd->Create(NULL, L"", WS_VISIBLE, CRect(0, 0, IMAGEX, IMAGEY), this, 0);
pDrawingWnd->ModifyStyleEx(0, WS_EX_LAYERED | WS_EX_TRANSPARENT);
pDrawingWnd->SetLayeredWindowAttributes(RGB(0,0,0), 0, LWA_COLORKEY);
然后,在一个定时器循环中,我在 CWnd DC 上画了一个矩形:
CDC mDC;
pDC = pDrawingWnd->GetDC();
mDC.CreateCompatibleDC(pDC);
if (drawingBmp)
delete drawingBmp;
drawingBmp = new CBitmap();
drawingBmp->CreateCompatibleBitmap(pDC, IMAGEX, IMAGEY);
CBitmap* pOldBmp2 = mDC.SelectObject(drawingBmp);
mDC.FrameRect(CRect(0,0,100,100), &brush);
pDC->BitBlt(0, 0, IMAGEX, IMAGEY, &mDC, 0, 0, SRCCOPY);
mDC.SelectObject(pOldBmp2);
ReleaseDC(pDC);
所以不是在对话框顶部绘制一个绿色矩形,它只是闪烁显示带有绿色矩形的黑色位图。通常我会将矩形直接绘制到对话框 dc,但是当我的更新速率较慢时,比如说每秒 10 次......它会缓慢地更新矩形的大小。所以我宁愿矩形的绘制与对话框上的 blit rate 无关。在另一个 DC 上绘制的正确方法是什么?
感谢您的帮助!
【问题讨论】:
标签: c++ visual-c++ bitmap mfc