Author Topic: hWND, hGET, hSetText.. Чё за хэ в начале? - MSDN: h goes for Handle  (Read 2006 times)

0 Members and 1 Guest are viewing this topic.

YoClickamann

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Когда читаю справку, всегда думаю, а что же значит это h в начале команд. Но только что порылся по MSDN и открыл для себя пару фактов:
1) h (в функциях hGet, hSet) значит handle (у каждого окна есть свой управляющий хендлер)
2) w (wParam) = word
3) l (lParam) = long

Пишут, что во времена 16-битной Винды параметры передавались через одно короткое 16-битное слово word и через длинное 32-битное long, а сейчас в Вин64 передаются и int64 в 64 бита соответственно (если кому интересно - здесь оригинал). На сайте указывается также и Message-структура для разных языков .NET:
[spoiler=HWnd, LParam, Msg, Result, WParam]
Имя   Описание
HWnd   Получает или задает дескриптор окна сообщения.
LParam   Задает поле LParam сообщения.
Msg   Получает или задает идентификатор сообщения.
Result   Указывает значение, возвращаемое операционной системе Windows в ответ на обработку сообщения.
WParam   Получает или задает поле WParam сообщения.
[/spoiler]

Также, если вы видели в справке кликера последнюю страницу (приложение с кодами клавиш), то возможно вам будет интересно посмотреть и более полную версию 16-ричных кодов на сайте Мелкософта (в статье Virtual-Key Codes for Windows).

А вот что говорится в доке по ВинАПИ, про функцию отрисовки окон, в которой и задаются все эти ваши LParam да WParam:
[spoiler=WndProc]
Эта функция производит обработку сообщений для окна. Мы ее связываем с окном при заполнении структуры класса окна WNDCLASS в поле lpfnWndProc:

WNDCLASS WC;
......
WC.lpfnWndProc = WndProc;
Вот эта функция WndProc и будет получать сообщения, которые Windows будет отсылать окну. Соответственно эта функция должна быть объявлена ранее. Прототип у этой функции такой:

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);
Общий вид для реализации:

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
{
   if (Message == WM_DESTROY )
   {
      PostQuitMessage(0);
      return 0;
   }
   return DefWindowProc(hwnd,Message,wparam,lparam);
}
В этой функции мы обрабатываем сообщения от Windows. При этом, если обработку не совершаем, то вызываем функцию по умолчанию DefWindowProc, которая умеет обрабатывать сообщения по умолчанию.


LRESULT DefWindowProc

   HWND hWnd,   // указатель окна
   UINT Msg,      // идентификатор сообщения
   WPARAM wParam,   // первый параметр сообщения
   LPARAM lParam   // второй параметр сообщения
);
Возврашает результат обработки сообщения. Обычно в функции WndProc организуется огромный switch для обработки сообщений.
[/spoiler]
И вот пример одной из конкретных реализаций, так сказать каркас:
[spoiler]
Code: (cpp) [Select]
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}
[/spoiler]

Также на МСДН нашёл страничку с перечнем разных типов оконных WM-сообщений, где говорится, что кроме WM, есть и другие виды сообщений:
[spoiler=Типы определяемых системой сообщений]
Prefix   Message category   Documentation
ABM and ABN   Application desktop toolbar   Shell Messages and Notifications
ACM and ACN   Animation control   Animation Control Messages and Animation Control Notifications
BCM, BCN, BM, and BN   Button control   Button Control Messages and Button Control Notifications
CB and CBN   ComboBox control   ComboBox Control Messages and ComboBox Control Notifications
CBEM and CBEN   ComboBoxEx control   ComboBoxEx Messages and ComboBoxEx Notifications
CCM   General control   Control Messages
CDM   Common dialog box   Common Dialog Box Messages
DFM   Default context menu   Shell Messages and Notifications
DL   Drag list box   Drag List Box Notifications
DM   Default push button control   Dialog Box Messages
DTM and DTN   Date and time picker control   Date and Time Picker Messages and Date and Time Picker Notifications
EM and EN   Edit control   Edit Control Messages, Edit Control Notifications, Rich Edit Messages, and Rich Edit Notifications
HDM and HDN   Header control   Header Control Messages and Header Control Notifications
HKM   Hot key control   Hot Key Control Messages
IPM and IPN   IP address control   IP Address Messages and IP Address Notifications
LB and LBN   List box control   List Box Messages and List Box Notifications
LM   SysLink control   SysLink Control Messages
LVM and LVN   List view control   List View Messages and List View Notifications
MCM and MCN   Month calendar control   Month Calendar Messages and Month Calendar Notifications
PBM   Progress bar   Progress Bar Messages
PGM and PGN   Pager control   Pager Control Messages and Pager Control Notifications
PSM and PSN   Property sheet   Property Sheet Messages and Property Sheet Notifications
RB and RBN   Rebar control   Rebar Control Messages and Rebar Control Notifications
SB and SBN   Status bar window   Status Bar Messages and Status Bar Notifications
SBM   Scroll bar control   Scroll Bar Messages
SMC   Shell menu   Shell Messages and Notifications
STM and STN   Static control   Static Control Messages and Static Control Notifications
TB and TBN   Toolbar   Toolbar Control Messages and Toolbar Control Notifications
TBM and TRBN   Trackbar control   Trackbar Control Messages and Trackbar Control Notifications
TCM and TCN   Tab control   Tab Control Messages and Tab Control Notifications
TDM and TDN   Task dialog   Task Dialog Messages and Task Dialog Notifications
TTM and TTN   Tooltip control   Tooltip Control Messages and Tooltip Control Notifications
TVM and TVN   Tree-view control   Tree View Messages and Tree View Notifications
UDM and UDN   Up-down control   Up-Down Messages and Up-Down Notifications
[/spoiler]

А вот какие существуют виды WM-сообщений общего назначения:
[spoiler]
Clipboard Messages
Clipboard Notifications
Common Dialog Box Notifications
Cursor Notifications
Data Copy Message
Desktop Window Manager Messages
Device Management Messages
Dialog Box Notifications
Dynamic Data Exchange Messages
Dynamic Data Exchange Notifications
Hook Notifications
Keyboard Accelerator Messages
Keyboard Accelerator Notifications
Keyboard Input Messages
Keyboard Input Notifications
Menu Notifications
Mouse Input Notifications
Multiple Document Interface Messages
Raw Input Notifications
Scroll Bar Notifications
Timer Notifications
Window Messages
Window Notifications
[/spoiler]

А вот как выглядит вызов функции SendMessage под cpp:
Code: (cpp) [Select]
LRESULT WINAPI SendMessage(
  _In_ HWND   hWnd,
  _In_ UINT   Msg,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);
Взято отсюда, также там есть пару ремарок про используемые параметры. А вот какой вид имеет функция отрисовки не для основного окна, а для диалогового:
[spoiler]
Code: (cpp) [Select]
BOOL CALLBACK DlgProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
default:
return FALSE;
}
}
[/spoiler]

Пока что не знаю, зачем точно это здесь и как именно это применить, но надеюсь, что здесь найдётся герой, изучащий всё это и ответящий нам на некоторые возникающие вопросы по месседжам.
Да разве могут дети юга где розы блещут в декабре
Где не разыщешь слова вьюга ни в памяти ни в словаре
Да разве им хоть так хоть вкратце хоть на минуту хоть во сне
Хоть ненароком догадаться что значит думать о весне?
Что значит в мартовские стужи когда отчаянье берёт
Всё ждать и ждать как неуклюже..