Другие языки программирования и технологии

Оконное приложение на WinAPI, вопрос про параметры функции WndProc. Язык программирования Си.

//Функция окна
LRESULT CALLBACK WndProc(HWND hWnd, UINT messg,
WPARAM wParam, LPARAM lParam) Почему параметры функции не имеют значений, а только типы - HWND UINT
WPARAM LPARAM и имена - hWnd messg wParam lParam?
Рома Крейза
Рома Крейза
2 042
Потому что это заголовок функции, а не ее вызов. Когда твоему приложению придет сообщение, эта функция будет вызвана системой для его обработки.
БЩ
Борис Щербаков
93 273
Лучший ответ
Рома Крейза Уточнил свой вопрос на Киберфоруме, если можно посмотрите пожалуйста cyberforum.ru/c-beginners/thread2389139.html
Значит всё дело в том, что это заголовок функции, это так?
Эмм... Значения в эту функцию передаются, а функция "должна" их обработать. Как и в любую другую функцию. В т. ч. и на языке C. Или Вы взялись за WinAPI не особо разбираясь в C? Тогда у меня плохая новость - без основ это будет проблематично. Ну и большинство примеров в MSDN по поводу WinAPI - C/C++.

Если интересуют параметры:
hWnd дескриптор окна
messg сообщение
wParam и lParam параметры сообщения (lParam часто указатель на что-либо или не используется)
Сама функция отвечает за обработку сообщений к окну.
Это интерфейс в старом олд-скульном стиле. Винда сама вызывает WndProc, скидывая туда все события в виде сообщений. И внутри функции обычно располагается ОГРОМНЫЙ такой оператор switch килобайт на 30-40. Где, в качестве case как раз фигурируют все эти сообщения. Так весь интерфейс раньше и строился. Кстати, перехватывая эти сообщения, можно было замутить любую херню: например, порно-баннеры, вымогатели и т. п.
Ну это callback функция (то есть вызывается не явно).
Если конкретно разбирать программу на винапи то...
В скажем так инициализации приложения есть вот такие (или похожие) строки:
while(GetMessage(&msg,0,0,0)!=0) // цикл получения сообщений окна
{
TranslateMessage(&msg); // тут точно не знаю что происходит
DispatchMessage(&msg); // а вот именно тут операционная система и вызывает нашу callback функцию заполняя именно те самые параметры.
}

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

Например если у вас messg равно WM_MOUSEMOVE то для этого сообщения
wParam будет указывать находятся ли в нажатом состоянии различные виртуальные клавиши. Этот параметр может состоять из одного или нескольких ниже перечисленных значений.

MK_CONTROLКлавиша CTRL находится в нажатом состоянии.
MK_LBUTTONЛевая кнопка мыши находится в нажатом состоянии.
MK_MBUTTONСредняя кнопка мыши находится в нажатом состоянии.
MK_RBUTTONПравая кнопка мыши находится в нажатом состоянии.
MK_SHIFTКлавиша SHIFT находится в нажатом состоянии.
MK_XBUTTON1Windows 2000/XP: Первая X-кнопка находится в нажатом состоянии.
MK_XBUTTON2Windows 2000/XP: Вторая X-кнопка находится в нажатом состоянии.

А lParam будет выставлено так, что:

Младшее слово устанавливает x-координату курсора. Координата - относительно левого верхнего угла рабочей области.

Старшее слово устанавливает y-координату курсора. Координата - относительно левого верхнего угла рабочей области.

одна из ссылок на запрос в поисковике "winapi WM_MOUSEMOVE"
http://www.vsokovikov.narod.ru/New_MSDN_API/Mouse_input/notify_wm_mousemove.htm
BD
Bohodir Dustov
15 398