Developer от Бога

DV

четверг, 6 июля 2017 г.

WinAPI. Button ( Кнопка ).

В Windows все создается в виде окон, в том числе и кнопки. Функция CreateWindow() которая создает самые обычные перекрывающие, всплывающие или дочерние окна, создает также и кнопки:


HWND WINAPI CreateWindow (
LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
INT х,
Int у,
INT nWidth,
INT nHeight,
HWND hWndParent,
HMENU HMenu,
HINSTANCE HINSTANCE,
LPVOID lpParam );



Что касается создания кнопок, в функции CreateWindow () нас интересуют два параметра которые делают окно - кнопкой: LPCTSTR lpClassName в который записывается имя класса (В нашем случае "BUTTON"), и HMENU HMenu , в который записываем нечто вроде идентификационного номера кнопки (число которое приводится к типу HMENU - (HMENU)1001), чтоб в функции обработчике WndProc() можно было различать нажатие одной кнопки от другой. В переменную HWND hWndParent заносим дескриптор окна, в котором будет создаваться кнопка. Как упоминалось ранее переменная типа HWND хранит дескриптор, своего рода указатель, через который мы управляем нужным окном.
Чтоб просмотреть простой пример работы кнопки, после созданного окна в прошлой статье добавим строки:


HWND OK = CreateWindow(
"BUTTON",
"OK",
WS_CHILD|WS_VISIBLE,
250,
150,
70 ,
30,
hwnd,
(HMENU)1001,
hThisInstance,
NULL
);  



После того как кнопка создана, нужно написать несколько строчек кода чтоб программа реагировала на действия. Windows генерирует огромное количество сигналов которые поступают от разных процессов в компьютере Операционной Системе. Все эти сигналы отправляются в функцию обработчик -
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
UINT message переменная сообщает о типе сообщения в целом, а WPARAM wParam и LPARAM lParam о дополнительных сведеньях сообщения.
При выборе меню, отправки сообщения родительскому окну, или нажатии на кнопку генерируется сообщение типа WM_COMMAND. Поэтому в операторе switch(message) создается дополнительная проверка на сообщение типа WM_COMMAND. Когда Windows генерирует это сообщение , проверяем параметр wParam, в котором хранится идентификатор события (например какое именно меню было выбрано, или какая кнопка была нажата).
В даном примере , после нажатия кнопки, в консольном окне выводится текстовое сообщение. Единственное дополнение - чтоб заработала функция printf() вывода в консоль, нужно подключить файл stdio.h :


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
{ case WM_COMMAND: if(wParam==1001) printf("OK!"); break;

case WM_DESTROY:
PostQuitMessage (0);
break;
default:
return DefWindowProc (hwnd, message, wParam, lParam);

}

return 0;

}


1 комментарий: