以下是程序开始时的外观: http://oi58.tinypic.com/2dwgs4h.jpg(如果我的代表少于10,则无法上传图片,抱歉)
只要我将光标悬停在更改标签上,每个不是tabcontrol子项的控件都会被涂成白色,如下所示: http://oi61.tinypic.com/2yvuiwl.jpg
以下是我在WM_CREATE中创建TabControl的方法:
RECT client_rect;
GetClientRect(hwnd, &client_rect);
TabControl = CreateWindowEx(WS_EX_COMPOSITED, WC_TABCONTROL, L"", WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
10, 10, client_rect.right - client_rect.left - 20,
client_rect.bottom - client_rect.top - 20, hwnd, (HMENU)110, GetModuleHandle(NULL), NULL);
TCITEM tab_info;
memset(&tab_info, 0, sizeof(tab_info));
tab_info.mask = TCIF_TEXT;
tab_info.pszText = L"Encoder";
tab_info.cchTextMax = 5;
SendMessage(TabControl, TCM_INSERTITEM, 0, (LPARAM)&tab_info);
tab_info.pszText = L"Decoder";
SendMessage(TabControl, TCM_INSERTITEM, 1, (LPARAM)&tab_info);
tab_info.pszText = L"Info Tab ";
SendMessage(TabControl, TCM_INSERTITEM, 2, (LPARAM)&tab_info);
RECT tab_rectangle;
GetClientRect(TabControl, &tab_rectangle);
SendMessage(TabControl, TCM_ADJUSTRECT, FALSE, (LPARAM)&tab_rectangle);
DefaultTabProc = (WNDPROC)SetWindowLongPtr(TabControl, GWL_WNDPROC, (LONG_PTR)TabProc);
每个其他控件都是主窗口的子窗口,除了左边的两个按钮,它们被自定义为TabControl的子窗口。
我已经将TC子类化为能够在左下角绘制50x50 px位图,并且我正在以这种方式处理子类wndproc的WM_PAINT:
case WM_PAINT:
{
if (!BitmapCall) //bool to decide whether I invalidated this rect to print the bitmap or not
CallWindowProc(DefaultTabProc, hwnd, uMsg, wParam, lParam);
if (EncodingTab) //we are in the Encoding tab, so print the bitmap
{
HDC hdc = GetDC(hwnd);
Graphics grap(hdc);
grap.DrawImage(&(*bitmap), 20, 248);
ReleaseDC(hwnd, hdc);
BitmapCall = false;
}
break;
}
奇怪的是,如果我调用Graphics grap(GetDC(hwnd));这个问题没有出现,如果不是因为应用程序启动后几十秒内我面临的巨大内存泄漏,我会选择这条路线。
我试图处理Tabcontrol的WM_ERASEBKGND,只是没有运气就返回TRUE。然后,我可以制作TC的每个控制孩子,但显然组合框和单选按钮不喜欢这个想法,并且全部涂成黑色,这给我带来了更多麻烦。 从主框架窗口绘制位图看起来是不可能的,因为它再次被TC重写, 我可能最终会尝试处理所有内容的绘制顺序,但我不知道从哪里开始/怎么做
提前致谢