Конфликт WinAPI в C ++ между SetLayeredWindowAttributes и BitBlt

Я создал собственное окно, используя DWM. Я нарисовал подпись с помощью PaintCustomCaption() ,который является примером из MSDN. Работало правильно, пока я не добавил SetLayeredWindowAttributes().

Окно перед добавлением

SetLayeredWindowAttributes(hWnd,RGB(0,0,1),0,LWA_COLORKEY);

введите описание изображения здесь

После добавления

введите описание изображения здесь

Я попытался изменить значения RGB, но он все еще был черным, кроме RGB (0,0,0).

Интересно, если BitBlt() работает правильно.

Отредактировано:

Причина, по которой я добавил SetLayeredWindowAttributes, заключается в решении этой проблемы.

введите описание изображения здесь

У вас есть другие способы нарисовать подпись?

case WM_ACTIVATE: {
DwmExtendFrameIntoClientArea(hWnd,&m); // m={-1,-1,-1,-1};
break;
}
case WM_INITDIALOG: {
SetWindowPos(hWnd,NULL,0,0,500,500,SWP_NOMOVE|SWP_FRAMECHANGED);
SetWindowLongPtr(hWnd,GWL_STYLE,WS_VISIBLE|WS_OVERLAPPEDWINDOW);
SetWindowLongPtr(hWnd,GWL_EXSTYLE,WS_EX_LAYERED);
SetLayeredWindowAttributes(hWnd,RGB(0,0,1),0,LWA_COLORKEY);
RedrawWindow(hWnd,NULL,NULL,RDW_INVALIDATE|RDW_ERASE);
return true;
}
case WM_PAINT: {
hdc=BeginPaint(hWnd,&paintstruct);
PaintCustomCaption(hWnd,hdc)
EndPaint(hWnd,&paintstruct);
break;
}

0

Решение

Если вы сохраняете границу окна, вам не нужно рисовать заголовок самостоятельно, если вы не хотите что-то добавить к заголовку.

То есть ручка WM_NCCALCSIZE а также WM_NCHITTEST обычно.

1

Другие решения

Во-первых, используйте RGB (200,201,202) в качестве ключа прозрачности вместо RGB (0,0,1).

Вы можете попробовать другие значения, но это лучшее из тех, что я тестировал.

Затем добавьте это после HBITMAP hbmOld=(HBITMAP)SelectObject(hdcPaint,hbm); в PaintCustomCaption():

FillRect(hdcPaint,&rcClient,CreateSolidBrush(RGB(200,201,202)));
0

По вопросам рекламы [email protected]