Re: Зачем выполнять SetWindowLongPtr(hwnd, DWLP_MSGRESULT, 0
От: ononim  
Дата: 06.08.11 18:35
Оценка: 2 (1) +1
читаем в MSDN про Return Value: http://msdn.microsoft.com/en-us/library/ms645469(v=vs.85).aspx
Как много веселых ребят, и все делают велосипед...
Зачем выполнять SetWindowLongPtr(hwnd, DWLP_MSGRESULT, 0); ?
От: meier13  
Дата: 06.08.11 17:45
Оценка:
Изучая примеры из книжки Рихтера, наткнулся что он процедуру диалогового окна описывает следующим образом:
INT_PTR WINAPI Dlg_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
   
   switch (uMsg) {
      chHANDLE_DLGMSG(hwnd, WM_INITDIALOG, Dlg_OnInitDialog);
      chHANDLE_DLGMSG(hwnd, WM_SIZE,       Dlg_OnSize);
      chHANDLE_DLGMSG(hwnd, WM_COMMAND,    Dlg_OnCommand);
   }
   return(FALSE);
}

Подстановка макроса chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand) приведет нас к следующему выражению:
case (WM_COMMAND): return 
    ( SetWindowLongPtr(hwnd, DWLP_MSGRESULT, (LPARAM)(LRESULT)(Dlg_OnCommand(hwnd, (int)(LOWORD(wParam)), (HWND)(lParam), (UINT)HIWORD(wParam)),0L), TRUE );

т.е мы возращаем
TRUE

попутно выполняя
Dlg_OnCommand(hwnd, (int)(LOWORD(wParam)), (HWND)(lParam), (UINT)HIWORD(wParam));

и выполняя
SetWindowLongPtr(hwnd, DWLP_MSGRESULT, 0);



собственно стало интересно с какой целью выполняется SetWindowLongPtr? (DWLP_MSGRESULT Устанавливает возвращаемое значение сообщения, обработанного в процедуре диалогового окна)


заменил
chHANDLE_DLGMSG(hwnd, WM_COMMAND,    Dlg_OnCommand);

на
case WM_COMMAND : return (Dlg_OnCommand(hwnd, (int)(LOWORD(wParam)), (HWND)(lParam), (UINT)HIWORD(wParam)), TRUE) ;

— никаких изменений в работе программы не заметил
Re: Зачем выполнять SetWindowLongPtr(hwnd, DWLP_MSGRESULT, 0
От: kero Россия  
Дата: 06.08.11 18:34
Оценка:
Здравствуйте, meier13, Вы писали:


M>Подстановка макроса chHANDLE_DLGMSG(hwnd, WM_COMMAND, Dlg_OnCommand) приведет нас к следующему выражению:

M>
M>case (WM_COMMAND): return 
M>    ( SetWindowLongPtr(hwnd, DWLP_MSGRESULT, (LPARAM)(LRESULT)(Dlg_OnCommand(hwnd, (int)(LOWORD(wParam)), (HWND)(lParam), (UINT)HIWORD(wParam)),0L), TRUE );
M>


M>собственно стало интересно с какой целью выполняется SetWindowLongPtr? (DWLP_MSGRESULT Устанавливает возвращаемое значение сообщения, обработанного в процедуре диалогового окна)


А вы прикиньте, что бывают не только WM_COMMAND, но и WM_NCHITTEST, WM_CTLCOLORDLG, etc.
Или не понял ваш вопрос?
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
Re[2]: Зачем выполнять SetWindowLongPtr(hwnd, DWLP_MSGRESULT
От: meier13  
Дата: 06.08.11 19:16
Оценка:
Здравствуйте, ononim, Вы писали:

O>читаем в MSDN про Return Value: http://msdn.microsoft.com/en-us/library/ms645469(v=vs.85).aspx


Ок спасибо, этот момент я как-то пропустил , да и про-то, что есть сообщения которые хотят возвращаемые значение тоже, так что строго не судите, просто win32 еще только начинаю изучать )))
Re[3]: Зачем выполнять SetWindowLongPtr(hwnd, DWLP_MSGRESULT
От: kero Россия  
Дата: 06.08.11 20:36
Оценка:
Здравствуйте, meier13, Вы писали:

M>Ок спасибо, этот момент я как-то пропустил , да и про-то, что есть сообщения которые хотят возвращаемые значение тоже,


Что значит "да и про то"? Это же про одно и то же
По всему, пашиным хозяевам позарез нужна война в Европе
(уверены — к ним не залетит, в предыдущих двух не залетало жеж)
Автор: kero
Дата: 21.07.14
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.