Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Помогите с WM_NOTIFY


Автор: yngwie19 20.1.2009, 23:32
Всем привет. В книге Финогенова "Основы программирования WIN32 ", описывается механизм распаковщиков сообщений или макросов сообщений. В частности  дается макрос HANDLE_MSG(hwnd, WM_NOTIFY,OnNotify), однако Я не могу найти где он определен, чтобы посмотреть как он разворачивается. Вообще другие используемые в книге макросы Я смотрел в windowsx.h, но как разворачивается WM_NOTIFY Я там не нашел. Может подскажите где он тогда определен? 

Автор: dumb 21.1.2009, 04:28
http://msdn.microsoft.com/en-us/library/bb775595(VS.85).aspx

Автор: yngwie19 21.1.2009, 07:40
dumb, Спасибо.

Автор: yngwie19 21.1.2009, 22:01
Ребят подскажите как расшифровывается тип одно из параметром этого сообщения - LPNMHDR. Может так его легче будет запомнить.

Автор: S.A.G. 21.1.2009, 22:09
Длинный указатель на структуру NMHDR. В том же Финогенове рассказывается и о венгерской нотации.

Код

typedef struct tagNMHDR {
    HWND hwndFrom;
    UINT_PTR idFrom;
    UINT code;
} NMHDR;


Структура содержит инфу о произошедшем событии. hwndFrom - хэндл того, от кого пришло, idFrom - его id, code - код уведомления.

Автор: yngwie19 21.1.2009, 22:25
S.A.G., кстати по Финогенову, не работает следующая фишка:

Код

LRESULT OnNotify(HWND, int, LPNMHDR lParam)                                          // Функция развернута из макроса
{
    if(lParam->code == TTN_NEEDTEXT)
    {
        LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT)lParam;         // Здесь почему-то не происходит перобразование
        UINT idBtn = lpttt->hdr.idForm;                                    // Соответственно на этой строчке вылетает ошибка:

Вот ошибка : error C2039: 'idForm' : is not a member of 'tagNMHDR'.

У Финогенова много таких мест. НЕ понятно каким он кмпилятором пользовался когда эту книгу писал.

Подскажите ребят почему не происходит преобразование ?

Автор: S.A.G. 21.1.2009, 22:28
А если так: hdr->idForm?

Автор: yngwie19 21.1.2009, 22:28
LPNMHDR
ну LP это понятно длинный указатель (просто указатель)
не понятно MN че такое
ну и HDR эта структура, которая также должна расшифровываться

Добавлено через 3 минуты и 18 секунд
S.A.G., это понятно что так сработает. Т.к структура TOOLTIPTEXT содержит один из элементов структуру hdr. Но есть поля которые нужно заполнить именно через указатель на TOOLTIPTEXT

Добавлено через 4 минуты и 55 секунд
по-ходу нужно какой-то хэдер еще подрубать

Автор: mes 21.1.2009, 22:36
Цитата(yngwie19 @  21.1.2009,  21:25 Найти цитируемый пост)
У Финогенова много таких мест. НЕ понятно каким он кмпилятором пользовался когда эту книгу писал.

ну тут Финогенов и его компилятор не при чем...  smile 

Цитата(yngwie19 @  21.1.2009,  21:25 Найти цитируемый пост)
error C2039: 'idForm' 

idFrom   smile

Добавлено @ 22:38
Цитата(yngwie19 @  21.1.2009,  21:28 Найти цитируемый пост)
не понятно MN че такое
ну и HDR эта структура, которая также должна расшифровываться

думаю NotifyMessageHeaDeR smile 

Автор: yngwie19 21.1.2009, 22:39
mes, все равно даже так. Таже самая ошибка

Автор: mes 21.1.2009, 22:44
а если с #include <winuser.h> ?

Автор: yngwie19 21.1.2009, 22:48
сделал так:
Код

LRESULT OnNotify(HWND, int, LPNMHDR lParam)
{
    if(lParam->code == TTN_NEEDTEXT)
    {
        LPTOOLTIPTEXT lpttt;
        lpttt =  (LPTOOLTIPTEXT)lParam;
        UINT idBtn = lpttt->idFrom;
    }

теперь пишет другое:
error C2039: 'idFrom' : is not a member of 'tagNMTTDISPIFNOA' что за нафиг.
Ребят подскажите в каком хэдере описан LPTOOLTIPTEXT ?

Автор: mes 21.1.2009, 23:00
http://msdn.microsoft.com/en-us/library/aa297203(VS.60).aspx

Добавлено @ 23:02
Цитата(yngwie19 @  21.1.2009,  21:48 Найти цитируемый пост)
 'tagNMTTDISPIFNOA' что за нафиг.

фактически то же самое что и LPTOOLTIPTEXT
Код

typedef struct tagNMTTDISPIFNOA {
    NMHDR hdr;
    LPSTR lpszText;
    char szText[80];
    HINSTANCE hinst;
    UINT uFlags;
#if (_WIN32_IE >= 0x0300)
    LPARAM lParam;
#endif
} NMTTDISPINFOA, FAR *LPNMTTDISPINFOA;


Автор: yngwie19 21.1.2009, 23:08
Цитата(mes @  21.1.2009,  22:44 Найти цитируемый пост)
а если с #include <winuser.h> ? 

у меня подключен <windows.h>, он черех него подключается. Нет все равно не работает

Автор: mes 21.1.2009, 23:09
Код

typedef struct tagNMHDR {
    HWND hwndFrom;
    UINT_PTR idFrom;
    UINT code;
} NMHDR;

    UINT_PTR idFrom; следовательно :
Код

        UINT idBtn = *(lpttt->hdr.idFrom);      

Автор: yngwie19 21.1.2009, 23:20
mes, Спасибо тебе огромное Я разоьрался  smile 

Автор: yngwie19 21.1.2009, 23:53
NMHDR расшифровывается как Notify Message Header

Автор: mes 21.1.2009, 23:56
Цитата(yngwie19 @  21.1.2009,  22:53 Найти цитируемый пост)
NMHDR расшифровывается как Notify Message Header 

Цитата(mes @  21.1.2009,  21:36 Найти цитируемый пост)
думаю NotifyMessageHeaDeR 
  smile 

Автор: yngwie19 22.1.2009, 00:08
mes, ну да именно  так.

Автор: Dem_max 22.1.2009, 05:40
Код

#include <windowsx.h> 

HANDLE_MSG(hwnd, WM_NOTIFY,         WM_OnNotify);

LRESULT WM_OnNotify(HWND hwnd, int wParam, NMHDR *lParam)
{
   UINT idBtn = lParam->idFrom;
   return FALSE;
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)