Вот как выглядит программа при запуске:
http://oi58.tinypic.com/2dwgs4h.jpg (не могу загрузить изображения, если у меня менее 10 представителей, извините)
Как только я наведу курсор мыши, чтобы изменить вкладку, каждый элемент управления, который не является дочерним элементом элемента управления tab, будет закрашен белым, как показано здесь:
http://oi61.tinypic.com/2yvuiwl.jpg
Вот как я создал TabControl в WM_CREATE:
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, чтобы иметь возможность рисовать это растровое изображение размером 50×50 пикселей в левом нижнем углу, и я обрабатываю WM_PAINT подкласса wndproc следующим образом:
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)); проблема не возникает, и я бы пошел по этому пути, если бы не большая утечка памяти, с которой я столкнулся через несколько десятков секунд после запуска приложения.
Я попытался обработать WM_ERASEBKGND в Tabcontrol и просто вернул TRUE без удачи. Затем я мог бы сделать каждого элемента управления дочерним элементом TC, но, очевидно, групповые блоки и переключатели не любят эту идею и окрашиваются в черный цвет, оставляя мне еще больше проблем.
Рисование растрового изображения из главного окна фрейма выглядит невозможным, так как оно снова перекрашивается повторным TC,
Я, наконец, могу попытаться справиться с порядком, в котором все расписано, но я понятия не имею, с чего начать / как это сделать.
заранее спасибо
Задача ещё не решена.