Как установить растровое изображение в качестве фона окна РЕБЕНОК (WIN32)

Прежде всего это не 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 пятого издания Чарльза Петцольда, и есть довольно большой раздел о растровых изображениях, но он не говорит о загрузке растрового изображения в дочернее окно, самое близкое, что он получает, это использование растровое изображение в меню, которое полностью отличается от окна.

2

Решение

Я думаю, что проблема в том, что общие элементы управления Windows не взаимодействуют с вашим приложением через оконную процедуру вашего основного потока, а через свои собственные (определяемые системой) оконные процедуры.

Так, например, когда ваше окно вкладок перерисовывается, оно не делает этого в ответ на сообщение WM_PAINT, поступающее в оконную процедуру, определенную в вашем коде. Вы должны убедиться, что это так, изучив дескрипторы окна сообщений, передаваемых в вашу оконную процедуру, например WM_PAINT.

Если вы хотите «использовать» стандартное поведение общего элемента управления, вы должны «подклассить» его (см. Вот) но по моему опыту попытка изменить поведение перерисовки обычно проблематична.

В случае элемента управления вкладками лучше всего создать массив дочерних окон, размер которого соответствует клиентской области элемента управления вкладками, и упорядочить, чтобы отображаемое в любой момент время соответствовало выбранной вкладке.

Если вы используете C ++, вы можете рассмотреть возможность создания базового класса, чтобы обернуть эти окна, в которых обрабатывается фоновый рисунок (растровое изображение). Затем вы можете получить серию оболочек для каждой отдельной вкладки. Я использовал именно такой подход в прошлом, и он хорошо работает.

Может быть полезно иметь в виду, что вкладки элемента управления вкладками не распространяются на всю клиентскую область элемента управления, а являются буквально самими вкладками. Я не помню деталей, но я думаю, что они обрабатываются внутри элемента управления, и что манипулирование ими любым способом является довольно хитрым, даже когда элемент управления подклассами — может быть неправильно в этом.

Надеюсь, это поможет.

Ура, Ян.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]