Как я могу создать кнопку, показывающую значок и текст, используя BS_ICON и отправляя BM_SETIMAGE?
Привет всем!
Я хотел бы начать с того, чтобы поблагодарить всех, кто тратит некоторое время на просмотр этой темы и пытается помочь.
Мне нужно сделать кнопку, которая является дочерним элементом главного окна со следующими характеристиками:
- Он имеет синий фон;
- I отображает значок;
- Он отображает текст под значком;
- Текст должен быть выделен жирным шрифтом;
- Текст на сербско-кириллическом языке;
Что касается текста, то я знаю, что есть стиль BS_BOTTOM для отображения его в нижней части кнопки, и есть функция SetFont (), чтобы сделать его жирным, но я не знаю, как заставить его принимать кириллические символы ( пример кода был бы очень признателен ).
Что касается части icon + text, то это то, что я пробовал до сих пор:
***********************************************************************************
Обновление №1: опубликовал весь код в надежде помочь другим быстрее найти решение.
************************************************************************************
Ресурса.ч
******************************************************
#ifndef IDC_STATIC
#define IDC_STATIC (-1)
#endif
#определить IDI_ICON1 100
*******************************************************
main.cpp
*******************************************************
#include "resource.h" #include <windows.h> static HINSTANCE hInst; // icon for desktop, ALT +TAB ... ( this same icon shall be used temporally for testing button ) static HICON hIcon; // WinMain's procedure LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_CREATE: { HWND hbtnUnosPodataka = CreateWindowEx(0, "Button", "Geotermist", WS_VISIBLE | WS_CHILD | BS_TEXT | BS_BOTTOM, 100, 100,150, 150, hwnd, (HMENU)4000, hInst, 0); HICON hIcon1 = LoadIcon( hInst, MAKEINTRESOURCE(IDI_ICON1)); SendMessage( hbtnUnosPodataka , BM_SETIMAGE, (WPARAM)IMAGE_ICON, (LPARAM)hIcon1); } break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } // WinMain int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) { // store hInstance in global variable hInst = hInstance; // load main window's icon - this same icon shall be used for testing the button hIcon = LoadIcon( hInst, MAKEINTRESOURCE(IDI_ICON1)); WNDCLASSEX wc; HWND hwnd; MSG Msg; wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = hIcon; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "Main_Window"; wc.hIconSm = hIcon; if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Window Registration Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } // main window hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, "Main_Window", "Geotermist", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); if(hwnd == NULL) { MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while(GetMessage(&Msg, NULL, 0, 0) > 0) { TranslateMessage(&Msg); DispatchMessage(&Msg); } return Msg.wParam; }
В MSDN указано, что для того, чтобы кнопка отображала значок и текст, BS_BITMAP или BS_ICON не должны быть установлены, и я должен отправить BM_SETIMAGE.
Я пытался это сделать, но ничего не вышло.
Я работаю в MS Visual Studio Express 2008, на Windows XP, на C++, используя WIN32 API. Если вам потребуется какая-либо другая информация ( исходный код или что-то подобное ), пожалуйста, попросите ее, я с удовольствием предоставлю ее вам.