Tabcontrol涂在主窗口的孩子身上

时间:2014-12-25 22:26:37

标签: c++ winapi gdi+ tabcontrol

以下是程序开始时的外观: 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重写, 我可能最终会尝试处理所有内容的绘制顺序,但我不知道从哪里开始/怎么做

提前致谢

0 个答案:

没有答案