winapi — Как создать кнопку C ++ со значком

Я пытаюсь сделать пользовательскую кнопку выхода, и я уже создал пользовательский рисунок для кнопки в фотошопе. У меня есть кнопка, как определено этим кодом:

button = CreateWindow(L"BUTTON", L"", WS_VISIBLE | WS_CHILDWINDOW, 400, 4, 480, 24, hWnd, button_id, hInstance, NULL);

Я хочу поставить либо close.bmp или же close.png или же close.ico (что проще) на кнопку, однако я не могу найти способ сделать это без MFC. Пожалуйста помоги!!!

Спасибо

1

Решение

Использовать BS_BITMAP или же BS_ICON стили кнопок. После создания кнопки отправьте BM_SETIMAGE сообщение с ручкой для вашего растрового изображения или значка. Чтобы получить ручку к вашему растровому изображению или значку, используйте LoadImage.

Если ваше изображение имеет альфа-канал (прозрачность), убедитесь, что оно сохранено как растровое изображение 32 бит на пиксель. Вы можете обойтись с иконкой, но края, вероятно, не будут такими гладкими.

3

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

Есть две основные возможности:

  1. Если вы хотите только поставить растровое изображение на обычной кнопке, затем создайте кнопку с WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_BITMAP сочетание стилей, загрузите растровое изображение, используя LoadBitmapи поместите загруженное растровое изображение на кнопку, отправив ее дескриптор на кнопку в BM_SETIMAGE сообщение.

  2. Если хотите изменить внешний вид всей кнопки, затем создать его с WS_CHILD|WS_VISIBLE|BS_OWNERDRAW сочетание стиля и обрабатывать WM_DRAWITEM сообщение. Брось lParam этого сообщения LPDRAWITEMSTRUCTи использовать его hDC член нарисовать кнопку. В вашем случае предварительно загрузите растровое изображение, используя LoadBitmapи нарисуйте его на DC, используя BitBlt или же TransparentBlt (источник). Кроме того, вы можете использовать LoadIcon а также DrawIconEx (источник). Другие члены DRAWITEMSTRUCT может использоваться для выбора растрового изображения, то есть внешнего вида кнопки, в зависимости от текущего действия или состояния.

3

Это сложно …

Лучше всего использовать кнопку «Рисование владельца», то есть с битом стиля BS_OWNERDRAW,

Затем владелец кнопки (родительское окно) получит сообщение WM_DRAWITEM всякий раз, когда кнопка должна быть перерисована.

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

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

1

Отправить BM_SETIMAGE сообщение и передать дескриптор загруженного изображения в lParam.

button1 = CreateWindowW(L"BUTTON", L"&Button", WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_BITMAP, 20, 50, 80, 25, hwnd, (HMENU) 600, NULL, NULL);

hImg = LoadImageW(NULL, L"test123.bmp", IMAGE_BITMAP, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE | LR_LOADFROMFILE);
SendMessageW(button1, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM) hImg);

П.С .: вам нужно использовать BS_BITMAP флаг, когда CreateWindow ()

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector