Какова цель возвращаемого значения обработчика сообщений INT_PTR? - PullRequest
1 голос
/ 31 мая 2011

Я играл с формами окон Visual Studio, и пример кода имел это:

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    /*code cut*/
    case WM_INITDIALOG:
        return (INT_PTR)TRUE;
    break;

В то время как моя другая функция обработчика выглядит так:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    /*code cut*/
    return 0; // no magical casting or anything, just plain int

У меня есть подсказка, чтов WndProc (), когда я делаю return 0;, это означает, что сообщение не будет обработано обработчиком сообщений по умолчанию?но если вы сделаете return 1;, он обработает обработчик по умолчанию?

Но какой смысл return (INT_PTR)TRUE;?и безопасно ли использовать простой стиль return 0; там?я попытался скомпилировать, и он работает только с простыми целочисленными значениями.

Кроме того, я не уверен, когда мне следует использовать, какое из значений, пример кода имеет это:

EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;

Нокакой смысл return (INT_PTR)TRUE; там?Я изменил его на FALSE, но не увидел никакой разницы в функциональности.

Итак, я не уверен, что это делает, может кто-нибудь очистить мои мысли по этому поводу, когда я должен использовать return 1 и когда я должен использовать return 0, и когда я должен использовать что-то еще (если ядолжен)?

Ответы [ 2 ]

3 голосов
/ 31 мая 2011

Первым фрагментом кода является DialogProc - цитирование соответствующих документов :

Возвращаемое значение
Тип: INT_PTR
Как правило, процедура диалогового окна должна возвращать TRUE, если она обработала сообщение, и FALSE, если это не так. Если процедура диалогового окна возвращает FALSE, диспетчер диалогов выполняет диалоговую операцию по умолчанию в ответ на сообщение.

Второй фрагмент кода - WindowProc - цитирование соответствующих документов :

Возвращаемое значение
Тип: LRESULT
Возвращаемое значение является результатом обработки сообщения и зависит от отправленного сообщения.

Итак, эта часть /*code cut*/ критически важна, потому что то, какое возвращаемое значение вы хотите, полностью зависит от того, какое сообщение обрабатывается.

0 голосов
/ 31 мая 2011

Они несколько одинаковы.LRESULT предназначен для типа возвращаемого значения, который может содержать что-то, по крайней мере, размер указателя на данной платформе.

От Типы данных Windows (Windows)

LRESULT :
Подписанный результат обработки сообщения.
Этот тип объявлен в WinDef.h следующим образом:

typedef LONG_PTR LRESULT;

LONG_PTR :
Длинный тип со знаком для точности указателя.Используется при приведении указателя на long для выполнения арифметики указателя.
Этот тип объявлен вследующим образом:

#if defined(_WIN64)
 typedef __int64 LONG_PTR; 
#else
 typedef long LONG_PTR;
#endif

Тип LRESULT претерпел ряд изменений за последние годы.Я считаю, что до Win64 он был определен как INT_PTR, но затем обновлен для переносимости под Win64.Ряд других типов претерпел аналогичные изменения, такие как WPARAM и LPARAM, которые раньше были 16-битными значениями в Win16, 32-битными значениями в Win32 и теперь 64-битными в Win64.

Фактическое возвращаемое значение варьируется в зависимости от контекста сообщения Windows, как указывает @ildjarn.Существует также вероятность того, что исходный код, который вы читаете, был, вероятно, создан до того, как Win64 стала большой проблемой, и, возможно, его не обновляли и не проверяли на переносимость с момента его написания.

Для переносимости определены символынемного по-разному в зависимости от цели компиляции.Следовательно, (INT_PTR)TRUE лучше, даже если вы знаете точное значение, которое должно быть возвращено и которое соответствует вашей сборке.Хотя return 0; может возвращать правильный результат в случаях, когда возвращаемое значение пусто, это плохая форма при компиляции в сценариях, где переносимость имеет значение.Использование return -1; или даже return 0x7FFFFFFF; еще хуже, поскольку вы можете обрезать, маскировать или иным образом искажать ответ, который должен быть дан для всех целей компиляции платформы.

Лучше всего использовать предопределенные символы и константы,правильные значения и типы будут подставлены вместо вас при изменении целей компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...