Win32 Tab控件灰色背景

4
我正在尝试使Win32中的UI变成白色。问题是我的选项卡控件的背景不是白色,所以选项卡本身并不是问题,而是选项卡旁边的部分是灰色。
我正在处理WM_CTLCOLORSTATIC静态控件,但似乎对于选项卡控件无效。
case WM_CTLCOLORSTATIC:
{
                          HDC hEdit = (HDC)w_param;
                          SetBkMode(hEdit, TRANSPARENT);
                          SetTextColor(hEdit, RGB(0, 0, 0));
                          SetBkColor(hEdit, RGB(255, 255, 255));
                          // Do not return a brush created by CreateSolidBrush(...) because you'll get a memory leak
                          return (INT_PTR)GetStockObject(WHITE_BRUSH);
}

我希望有一种“简单”的方法可以让整个用户界面变为白色 :)

祝好
2个回答

1
你无法捕获一条消息并在灰色背景上绘制。系统会在WM_PRINTCLIENT中绘制所有内容。不过,有一个很好的技巧!这个想法来自this post
我在WM_PAINT处理程序中执行以下操作:
  1. 创建一个内存DC以绘制
  2. 向选项卡控件发送WM_PRINTCLIENT消息,使其将选项卡绘制到您的内存DC中
  3. 创建一个区域,镜像选项卡的形状
  4. 使用所需的背景画刷填充此区域之外(RGN_DIFF)的内存DC部分
  5. 将结果Blt到BeginPaint返回的DC中
  6. 调用EndPaint并返回,当然不要调用选项卡控件自己的WndProc :)
第3步有点棘手,因为您必须知道选项卡的位置和形状,但除此之外,它是一个相当干净的解决方案(请参见以下示例代码下面的图像)。您可能可以使用TransparentBlt替换系统背景颜色。

在此解决方案中,我使用了TransparentBlt

创建hdcMemTab,即第1步。

HBITMAP hBitmap, hBitmapOld ; //keep them till the end of the program
HDC hdcMemTab; //keep it till the end of the program

HDC hdc;
Rect rt;
hdc = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL);
hdcMemTab = CreateCompatibleDC(hdc);
GetWindowRect(hwnd_Tab, &rt);

rt.right  = rt.right - rt.left;
rt.bottom = rt.bottom - rt.top;
rt.left   = 0; 
rt.top    = 0;

hBitmap = CreateCompatibleBitmap(hdc, rt.right, rt.bottom);
hBitmapOld = SelectObject(hdcMemTab, hBitmap);
DeleteDC(hdc);

在子类化的选项卡控件中的 WM_PAINT
RECT rt, rtTab;
HDC hdc = BeginPaint(hwnd, &ps);

GetWindowRect(hwnd_Tab, &rt);

rt.right  = rt.right - rt.left;
rt.bottom = rt.bottom - rt.top;
rt.left   = 0; 
rt.top    = 0;

//step 2
SendMessage(hwnd_Tab, WM_PRINTCLIENT, (WPARAM)hdcMemTab, PRF_CLIENT);

FillRect(hdc, &rt, gBrushWhite); //gBrushWhite has the desired background color

HRGN hRgn = CreateRectRgn(0, 0, 0, 0);

int n_items = TabCtrl_GetItemCount(hwnd_Tab);

//get tabs region, step 3
for(i = 0; i < n_items; i++){
    TabCtrl_GetItemRect(hwnd_Tab, i, &rtTab);

    HRGN hTabRgn = CreateRectRgn(rtTab.left, rtTab.top, rtTab.right, rt.bottom);

    CombineRgn(hRgn, hRgn, hTabRgn, RGN_OR);

    DeleteObject(hTabRgn);
}

GetRgnBox(hRgn, &rtTab);

DeleteObject(hRgn);

//step 5
TransparentBlt(hdc, 0, 0, rt.right, rt.bottom, hdcMemTab, 0, 0, rt.right, rt.bottom, RGB(240, 240, 240)); //(240, 240, 240) is the grey color
BitBlt(hdc, rtTab.left, rtTab.top, rtTab.right - 5, rtTab.bottom, hdcMemTab, rtTab.left, rtTab.top, SRCCOPY);

EndPaint(hwnd, &ps);

//step 6
return 0;

1
抱歉我的英语不好。我的做法是在WM_PRINTCLIENT消息中什么也不做,只返回0,即防止WM_PRINTCLIENT调用DefWindowProc。这会导致选项卡控件标头与其父窗口具有相同的背景颜色。对于TrackBar也是如此。我只在Windows 10上测试过,想知道它是否也适用于Win 7。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接