我正在使用visual studio的windows窗体,示例代码有:
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
,何时应该使用其他东西(如果我应该)?
答案 0 :(得分:3)
第一段代码是DialogProc - 引用the relevant docs:
返回值
输入:INT_PTR
通常,如果对话框过程处理了消息,则应返回TRUE
,如果不处理,则返回FALSE
。如果对话框过程返回FALSE
,则对话框管理器将执行默认对话框操作以响应该消息。
第二段代码是WindowProc - 引用the relevant docs:
返回值
输入:LRESULT
返回值是消息处理的结果,取决于发送的消息。
因此,/*code cut*/
部分是至关重要的,因为您想要的返回值完全取决于正在处理的消息。
答案 1 :(得分:0)
他们有点相同。 LRESULT
旨在成为一种返回值类型,它至少可以保存给定平台上指针的大小。
来自Windows Data Types (Windows)
<强> LRESULT 强>:
签名消息处理结果。
此类型在WinDef.h中声明如下:
typedef LONG_PTR LRESULT;
<强> LONG_PTR 强>:
指针精度的有符号长整型。在将指针强制转换为长指针运算时使用。
此类型在&lt; BaseTsd.h&gt;中声明。如下:
#if defined(_WIN64)
typedef __int64 LONG_PTR;
#else
typedef long LONG_PTR;
#endif
LRESULT
类型多年来经历了多次变化。我相信在Win64之前,它被定义为INT_PTR
,但随后在Win64下更新了可移植性。许多其他类型经历了类似的更改,例如WPARAM
和LPARAM
,它们在Win16中曾经是16位值,在Win32中是32位值,现在在Win64中是64位。 / p>
返回的实际值因Windows消息上下文而异,正如@ildjarn所指出的那样。您正在阅读的示例源也可能是在Win64成为大问题之前创建的,并且可能因为编写而无法更新或检查其可移植性。
为了便于携带,根据编译目标,符号的定义略有不同。因此,(INT_PTR)TRUE
更好,即使您知道应该返回的确切值恰好与您的构建匹配。虽然return 0;
可能会在返回值为空的情况下返回正确的结果,但在可移植性很重要的情况下进行编译时,这是不好的形式。使用return -1;
甚至return 0x7FFFFFFF;
会更糟糕,因为您可能会截断,屏蔽或以其他方式破坏应为所有平台编译目标提供的响应。
最好使用预定义的符号和常量,因为在更改编译目标时,将替换正确的值和类型。