C++ 在透明CWnd DC上绘制

C++ 在透明CWnd DC上绘制,c++,visual-c++,bitmap,mfc,C++,Visual C++,Bitmap,Mfc,我正在尝试在MFC对话框的顶部创建一个透明的CWnd,这样我就可以将bitblt位图映射到对话框dc,然后分别绘制直接位于对话框顶部的透明dc的形状。问题是,我似乎无法让CWnd透明化。相反,每当我在透明的CWnd上闪烁一个黑色位图时,它就会随着对话框闪烁。。。就好像一个人要blit对话框dc,然后紧接着blit一个黑色位图到同一个dc 例如,在对话框中,我创建了一个CWnd对象,该对象将是透明覆盖: pDrawingWnd = new CWnd(); pDrawingWnd->Creat

我正在尝试在MFC对话框的顶部创建一个透明的CWnd,这样我就可以将bitblt位图映射到对话框dc,然后分别绘制直接位于对话框顶部的透明dc的形状。问题是,我似乎无法让CWnd透明化。相反,每当我在透明的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速率无关。在另一个DC上绘制的正确方法是什么


谢谢你的帮助

您需要使用每像素alpha进行创建。

正在使用:pDrawingWnd->ModifyStyleEx(0,WS_EX_LAYERED | WS_EX_TRANSPARENT)@谷歌,但不是每像素阿尔法。您不能在那里使用兼容位图,只能使用带有alpha的位图(32位dib)