Я создал собственное окно, используя 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;
}
Если вы сохраняете границу окна, вам не нужно рисовать заголовок самостоятельно, если вы не хотите что-то добавить к заголовку.
То есть ручка WM_NCCALCSIZE
а также WM_NCHITTEST
обычно.
Во-первых, используйте RGB (200,201,202) в качестве ключа прозрачности вместо RGB (0,0,1).
Вы можете попробовать другие значения, но это лучшее из тех, что я тестировал.
Затем добавьте это после HBITMAP hbmOld=(HBITMAP)SelectObject(hdcPaint,hbm);
в PaintCustomCaption()
:
FillRect(hdcPaint,&rcClient,CreateSolidBrush(RGB(200,201,202)));