Я пытаюсь сделать пользовательскую кнопку выхода, и я уже создал пользовательский рисунок для кнопки в фотошопе. У меня есть кнопка, как определено этим кодом:
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. Пожалуйста помоги!!!
Спасибо
Использовать BS_BITMAP
или же BS_ICON
стили кнопок. После создания кнопки отправьте BM_SETIMAGE
сообщение с ручкой для вашего растрового изображения или значка. Чтобы получить ручку к вашему растровому изображению или значку, используйте LoadImage
.
Если ваше изображение имеет альфа-канал (прозрачность), убедитесь, что оно сохранено как растровое изображение 32 бит на пиксель. Вы можете обойтись с иконкой, но края, вероятно, не будут такими гладкими.
Есть две основные возможности:
Если вы хотите только поставить растровое изображение на обычной кнопке, затем создайте кнопку с WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_BITMAP
сочетание стилей, загрузите растровое изображение, используя LoadBitmap
и поместите загруженное растровое изображение на кнопку, отправив ее дескриптор на кнопку в BM_SETIMAGE
сообщение.
Если хотите изменить внешний вид всей кнопки, затем создать его с WS_CHILD|WS_VISIBLE|BS_OWNERDRAW
сочетание стиля и обрабатывать WM_DRAWITEM
сообщение. Брось lParam
этого сообщения LPDRAWITEMSTRUCT
и использовать его hDC
член нарисовать кнопку. В вашем случае предварительно загрузите растровое изображение, используя LoadBitmap
и нарисуйте его на DC, используя BitBlt
или же TransparentBlt
(источник). Кроме того, вы можете использовать LoadIcon
а также DrawIconEx
(источник). Другие члены DRAWITEMSTRUCT
может использоваться для выбора растрового изображения, то есть внешнего вида кнопки, в зависимости от текущего действия или состояния.
Это сложно …
Лучше всего использовать кнопку «Рисование владельца», то есть с битом стиля BS_OWNERDRAW
,
Затем владелец кнопки (родительское окно) получит сообщение WM_DRAWITEM
всякий раз, когда кнопка должна быть перерисована.
Недостатком является то, что кнопка должна быть полностью закрашена, не только значок, но и рамка, фон, метка, если требуется, прямоугольник фокуса … Вы должны проверить связанный DRAWITEMSTRUCT
и решить точный стиль, который будет нарисован.
Для облегчения работы может быть полезна функция Windows DrawFrameControl()
это рисует несколько стилей рамок, включая стандартную рамку кнопки.
Отправить 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 ()