【问题标题】:Drawing on a transparent CWnd DC在透明的 CWnd DC 上绘图
【发布时间】: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


    【解决方案1】:

    您需要使用每个像素的 alpha 创建 layered window。

    【讨论】:

    • 正在使用:pDrawingWnd->ModifyStyleEx(0, WS_EX_LAYERED | WS_EX_TRANSPARENT);
    • @Goober 但不是每像素 alpha。你不能在那里使用兼容的位图,只能使用带有 alpha 的位图(32 位 dib)
    猜你喜欢
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2020-08-17
    • 1970-01-01
    • 2014-06-06
    相关资源
    最近更新 更多