C ++ WinAPI SetLayeredWindowAttributes和BitBlt之间的冲突

时间:2015-09-14 12:10:26

标签: c++ winapi dwm

我使用DWM创建了一个自定义窗口。我使用PaintCustomCaption()绘制了标题,这是MSDN的一个示例。它正常工作,直到我添加SetLayeredWindowAttributes()

添加前的窗口

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

enter image description here

添加

enter image description here

我尝试更改RGB值但除了RGB(0,0,0)之外它仍然是黑色。

我想知道BitBlt()是否正常运作。

编辑:

我添加SetLayeredWindowAttributes的原因是为了解决这个问题

enter image description here

你有其他方法来描绘标题吗?

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;
}

2 个答案:

答案 0 :(得分:1)

如果保留窗口边框,除非要在标题中添加内容,否则无需自己绘制标题。

即,正常处理WM_NCCALCSIZEWM_NCHITTEST

答案 1 :(得分:0)

首先,使用RGB(200,201,202)作为透明度键而不是RGB(0,0,1)。

您可以尝试其他值,但这是迄今为止我测试过的最佳值。

然后,在HBITMAP hbmOld=(HBITMAP)SelectObject(hdcPaint,hbm);PaintCustomCaption()之后添加此内容:

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