Отображение растрового изображения в окне класса «КНОПКА» в WIN32 - PullRequest
5 голосов
/ 10 мая 2009

Редактировать: Я думаю, что сообщение WM_CREATE не отправляется при создании дочерних окон (а именно, моей кнопки). Поэтому, вызывая SendMessage во время WM_CREATE, я отправляю сообщение в окно, которое еще не было создано. Решением на данный момент является вызов SendMessage () во время сообщения WM_SHOWWINDOW. Дочерние окна отправляют сообщения WM_CREATE при создании?

Почему растровое изображение не отображается на кнопке? Растровое изображение имеет размер 180x180 пикселей.

У меня есть файл ресурсов с:

Bit BITMAP bit.bmp

Затем я создаю главное окно и дочернее окно «КНОПКА» с:

HWND b, d;

b = CreateWindow(L"a", NULL, WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, 0, 0, 
                  hInstance, 0);

d = CreateWindow(L"BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 
                 10, 10, 180, 180, b, 200, hInstance, 0);

Затем в моей процедуре Windows я посылаю окну «КНОПКА» сообщение «BM_SETIMAGE» с:

HBITMAP hbit; 

case WM_CREATE:    // It works if I change this to: case WM_SHOWWINDOW 

hbit = LoadBitmap(hInstance, L"Bit");

SendMessage(d, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbit);

LoadBitmap () возвращает действительный дескриптор, поскольку он не возвращает NULL, и я могу отобразить растровое изображение в клиентской области с помощью функции BitBlt (). Поэтому я либо неправильно отправляю сообщение, либо неправильно создаю окно "КНОПКА".

Что я делаю не так?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 10 мая 2009

Оконная процедура для вашего оконного класса "a" вызывается с WM_CREATE при создании окна этого класса. Это происходит во время вашего первого вызова CreateWindow, то есть до того, как вы создадите дочернее BUTTON окно. WM_CREATE означает «вы создаете» - это не значит «ребенок создается».

Решение состоит в том, чтобы вызвать d = CreateWindow(L"BUTTON"...) в обработчике WM_CREATE для класса "a":

case WM_CREATE:
    d = CreateWindow(L"BUTTON", NULL, WS_CHILD | WS_VISIBLE | BS_BITMAP, 
                     10, 10, 180, 180, hwnd, 200, hInstance, 0);
    hbit = LoadBitmap(hInstance, L"Bit");
    SendMessage(d, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hbit);
0 голосов
/ 10 мая 2009

Как вы проверяете, что WM_CREATE не вызывают? Поскольку BUTTON не является вашим классом окна (а скорее определяется ОС), ему принадлежит WndProc для окна, а не вы - поэтому WM_CREATE не следует вызывать для кнопки в вашем коде, потому что BUTTON не ваш класс.

Если вы хотите получать сообщения для кнопки, вам придется создать ее подкласс, а затем указать свой собственный WndProc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...