Зачем выполнять 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) ;

— никаких изменений в работе программы не заметил
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.