Прежде всего это не MFC.
Вот урезанная версия GUI, над которой я работал:
Как вы можете видеть, есть растровое изображение над элементом управления вкладками (которое использует дескриптор окна по умолчанию), я буду называть его «Blue Bitmap», у меня нет проблем с ним, он функционирует отлично.
У меня проблема в том, установка другое растровое изображение (из растрового файла на диске) на фоне дочернего окна (точнее дочернего окна с вкладками), заменяющее серый цвет. Вот некоторые вещи, которые я сделал для пытаться и установите растровое изображение в качестве фона для дочернего окна (вкладка).
1) Я использовал тот же метод, который использовался для назначения синего растрового изображения окну, сначала импортировав растровое изображение с помощью LoadImage, вот так:
index->hbmBitmapBanner = (HBITMAP)LoadImage(index->hInstance,L"Images\\horizontal.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
Затем в сообщении WM_PAINT:
case WM_PAINT:
{
PAINTSTRUCT ps1;
if (BeginPaint(WINDOWHANDLE,&ps1))
{
HDC hdcBanner = CreateCompatibleDC(ps1.hdc);
HBITMAP hbmOldHorizontal = (HBITMAP)SelectObject(hdcBanner,index->hbmBitmapBanner); // banner
BitBlt(ps1.hdc,0,0,516,101,hdcBanner,5,0,SRCCOPY);
SelectObject(hdcBanner,hbmOldHorizontal);
DeleteDC(hdcBanner);
EndPaint(WINDOWHANDLE,&ps1);
}
break;
}
Этот код был успешным при установке синего растрового изображения в окне, но не при установке другого растрового изображения в окне (с заменой переменных синего растрового изображения, разумеется, также изменились размер и ориентация). Он просто не отображал растровое изображение на экране, и окно оставалось неизменным, пока нет Функции не удалось. ТАКЖЕ, когда я поменялся местами расположения файлов, он загрузил растровое изображение туда, где было синее растровое изображение, поэтому в функции загрузки определенно не было сбоев.
2) Используя приведенный выше код, я попытался изменить первый аргумент BeginPaint на дескриптор окна блока управления вкладками, это опять оказалось бесполезным, и окно осталось неизменным. Я также попытался изменить первый аргумент BeginPaint на дочернее окно, которое отображается на информационной вкладке, это привело к исчезновению дочернего окна (которое является групповым полем), но в окне все еще не появилось растровое изображение.
3) В крайнем случае я тупо пытался использовать эту функцию на дочернем окне
SetClassLongPtr(tab->hTabIndex[0],GCLP_HBRBACKGROUND,(DWORD)GetStockObject(BLACK_BRUSH));
И конечно, это не сработало
Если это пригодится, вот как я создал вкладку в моем окне:
TCITEM tie = {0};
tab->hTab = CreateWindowEx(0,WC_TABCONTROL,L"",WS_CHILD | WS_VISIBLE,0,101,600,400,
WINDOWHANDLE,NULL,(HINSTANCE)GetWindowLong(WINDOWHANDLE,GWLP_HINSTANCE),NULL
);
Является ли основной вкладкой элемент управления, с последующей вставкой отдельных вкладок (т. Е. Информационной вкладки)
TCHAR pszTab1 [] = L"Information"; // tab1's text
tie.pszText = pszTab1; // the tab's text/caption
TabCtrl_InsertItem(tab->hTab, 0, &tie); // insert the tab
Дополнительная информация: вкладка управления, и окна работают / взаимодействуют в совершенстве кроме этого. Я тестировал / пытался сделать это только для одной вкладки, потому что я знал, что если она работает на одной вкладке, то она будет работать на всех вкладках, следовательно, экономя время.
У меня есть справочное руководство по программированию для Windows пятого издания Чарльза Петцольда, и есть довольно большой раздел о растровых изображениях, но он не говорит о загрузке растрового изображения в дочернее окно, самое близкое, что он получает, это использование растровое изображение в меню, которое полностью отличается от окна.
Я думаю, что проблема в том, что общие элементы управления Windows не взаимодействуют с вашим приложением через оконную процедуру вашего основного потока, а через свои собственные (определяемые системой) оконные процедуры.
Так, например, когда ваше окно вкладок перерисовывается, оно не делает этого в ответ на сообщение WM_PAINT, поступающее в оконную процедуру, определенную в вашем коде. Вы должны убедиться, что это так, изучив дескрипторы окна сообщений, передаваемых в вашу оконную процедуру, например WM_PAINT.
Если вы хотите «использовать» стандартное поведение общего элемента управления, вы должны «подклассить» его (см. Вот) но по моему опыту попытка изменить поведение перерисовки обычно проблематична.
В случае элемента управления вкладками лучше всего создать массив дочерних окон, размер которого соответствует клиентской области элемента управления вкладками, и упорядочить, чтобы отображаемое в любой момент время соответствовало выбранной вкладке.
Если вы используете C ++, вы можете рассмотреть возможность создания базового класса, чтобы обернуть эти окна, в которых обрабатывается фоновый рисунок (растровое изображение). Затем вы можете получить серию оболочек для каждой отдельной вкладки. Я использовал именно такой подход в прошлом, и он хорошо работает.
Может быть полезно иметь в виду, что вкладки элемента управления вкладками не распространяются на всю клиентскую область элемента управления, а являются буквально самими вкладками. Я не помню деталей, но я думаю, что они обрабатываются внутри элемента управления, и что манипулирование ими любым способом является довольно хитрым, даже когда элемент управления подклассами — может быть неправильно в этом.
Надеюсь, это поможет.
Ура, Ян.
Других решений пока нет …