Рисунок на прозрачном CWnd DC

0

Я пытаюсь создать прозрачный CWnd поверх диалога MFC, чтобы я мог бить битовые растровые изображения в диалоговом окне 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?

Спасибо за любую помощь!

Теги:
visual-c++
mfc
bitmap

1 ответ

0

Вам необходимо создать многоуровневое окно с альфа-пикселем.

  • 0
    Это делается с помощью: pDrawingWnd-> ModifyStyleEx (0, WS_EX_LAYERED | WS_EX_TRANSPARENT);
  • 0
    @ Губер, но не с альфа-точкой на пиксель. Вы не можете использовать совместимое растровое изображение там, для этого можно использовать только растровые изображения с альфа-каналом (32-битное разрешение)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню