Создание кнопки (button)

Кнопка – один из элементов интерфейса пользователя компьютерной программы, «нажатие (клик)» на которую приводит к некоторому действию, заложенному в программе.

Кнопка с точки зрения программиста – это тоже окно, а раз это окно, то для создания кнопки (как и любого другого окна) мы используем функцию CreateWindow().

Синтаксис:

1
2
3
4
5
6
7
8
9
10
11
12
13
HWND WINAPI CreateWindow(
      LPCTSTR lpClassName,
      LPCTSTR lpWindowName,
      DWORD dwStyle,
      int x,
      int y,
      int nWidth,
      int nHeight,
      HWND hWndParent,
      HMENU hMenu,
      HINSTANCE hInstance,
      LPVOID lpParam
);

Вызов данной функции для создания кнопки несколько отличается вызова функции для создания окна:
– в качестве параметра lpClassName указывается ключевое слово «button»;
– параметр lpWindowName задает строку, которая будет написана на кнопке;
– параметр dwStyle задает стиль кнопки;
– параметр hWndParent задает родительское окно в рабочей области которого создается кнопка;
– параметр hMenu задает идентификатор кнопки;
– параметр lpParam должн быть равен NULL.

Пример:

1
2
CreateWindow("button", "Press me", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 10, 80, 30, hwnd, (HMENU)10000, hInstance, NULL);

Этот фрагмент надо вставить, например, сразу после вызова метода CreateWindow для создания основного окна нашего приложения в функции WinMain. Т. е. один CreateWindow используется для создания главного окна и надо вызывать свой CreateWindow для каждого элемента управления на форме.

Обратите внимание на первый параметр – как вы помните, в функции CreateWindow это имя класса, на основании которого мы создаем наше окно. Тут мы пишем не имя нашего класса, а имя предопределенного в Windows класса – button. Это класс для различных видов кнопкок, куда относятся собственно кнопки, радиокнопки, checkbox’ы. Что именно за тип кнопки создается, опеределяется третьим параметром (как вы видите, тут мы поставили BS_PUSHBUTTON – стиль обычной кнопки).

Второй параметр функции CreateWindow – это надпись, которую пользователь увидит на кнопке.

Еще два важных параметра – это 8-й и 9-й (у нас это hwnd и (HMENU)10000).

Вот пример:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include 
 
<code>LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);</code>
 
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
char cname[]="Class";
char title[]="Наше первое окно";
MSG msg;
 
//структура для регистрации класса окон
WNDCLASS wc;
wc.style = 0;
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszMenuName = 0;
wc.lpszClassName = cname;
//регестрируем класс
if(!RegisterClass(&wc)) return 0;
//создать окно
HWND hWnd = CreateWindow(cname, title, WS_OVERLAPPEDWINDOW,
0, 0, 500, 300, NULL, NULL, hInstance, NULL);
//проверим создалось ли окно
if(!hWnd)return 0;
//Создаем кнопку
HWND hWnd_button = CreateWindow("button", "Press me", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 10, 80, 30, hWnd, (HMENU)10000, hInstance, NULL);
//показать окно
ShowWindow(hWnd, nCmdShow);
//обновить содержимое окна
UpdateWindow(hWnd);
 
//цикл обработки сообщений
while(GetMessage(&msg, NULL,0 ,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
};
 
 
 
<code>//процедура окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_CREATE:
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_PAINT:
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}</code>
 
Для обработки обработки нажатия кнопки необходимо отслеживать сообщение <code>WM_COMMAND</code>.
Сообщение WM_COMMAND отправляется окну, когда пользователь выбирает пункт меню или использует акселератор для того или иного действия. Также это же сообщение посылается от различных элементов управления на окне.
 
Вот что, например, мы можем написать для нашей кнопки:
1
2
3
4
5
6
7
8
9
10
LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    switch (Message){
    case WM_COMMAND:
        if(LOWORD(wparam)==10000)
        {
            MessageBox(hwnd, "Кнопка нажата", "", 0);
        }
        break;
        ...

Так как почти все элементы управления посылают WM_COMMAND, то нам надо как-то различать их. Это мы делаем через идентификатор элемента управления. Для сообщения WM_COMMAND он передается в младшей части wparam.

  1. IntelliSense: a value of type “char *” cannot be assigned to an entity of type “LPCWSTR”
    ругается на CreateWindow

    • набери текст так L”твой тут текст” у тебя проект в юникоде,а хотел написать обычные строки

      • Макрокоманда TEXT и так добавляет символ L к тексту если проект использует набор символов Unicode, а так же ничего не добавляет к строке если проект использует ASCII.

        Так что правельнее писать TEXT(“Строка”).

  2. TEXT(“blabla”). пошло. спасибо

  3. Можно ли как-то различать нажатия правой и левой кнопки мыши?

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>