C++ 消息处理程序INT_PTR返回值的用途是什么?
我正在使用visual studio的windows窗体,示例代码如下:C++ 消息处理程序INT_PTR返回值的用途是什么?,c++,visual-studio-2008,winapi,visual-c++,C++,Visual Studio 2008,Winapi,Visual C++,我正在使用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; EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRU
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
/*code cut*/
case WM_INITDIALOG:
return (INT_PTR)TRUE;
break;
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
而我的另一个处理函数如下所示:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
/*code cut*/
return 0; // no magical casting or anything, just plain int
我有一个线索,在WndProc()中,当我执行时返回0代码>这意味着默认消息处理程序无法处理消息?但如果您执行操作,则返回1代码>它将使用默认处理程序处理
但是return(INT_PTR)TRUE的意义是什么代码>?使用纯返回0是否安全代码>样式在那里?我试着编译,它也只能使用纯整数值
此外,我不确定什么时候应该使用这些值中的哪一个,示例代码有以下内容:
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
/*code cut*/
case WM_INITDIALOG:
return (INT_PTR)TRUE;
break;
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
但是返回(INT_PTR)TRUE的意义是什么代码>那里?我将其更改为FALSE
,但在功能上看不到任何差异
因此,我不知道这是在做什么,有谁能让我清楚这一点,我应该什么时候使用返回1
,我应该什么时候使用返回0
,我应该什么时候使用其他东西(如果我应该的话)?第一段代码是DialogProc--quoting:
返回值
类型:INT\u PTR
通常,如果对话框过程处理了消息,则应返回TRUE
,如果未处理消息,则应返回FALSE
。如果对话框过程返回FALSE
,对话框管理器将执行默认对话框操作以响应消息
第二段代码是WindowProc——引用:
返回值
类型:LRESULT
返回值是消息处理的结果,取决于发送的消息
因此,/*code cut*/
部分至关重要,因为您想要的返回值完全取决于正在处理的消息。它们有些相同LRESULT
是一种返回值类型,可以在给定平台上保存至少与指针大小相同的内容
从
LRESULT:
消息处理的签名结果。
该类型在WinDef.h中声明如下:
LONG\u PTR:
指针精度的有符号长类型。将指针强制转换为长指针时使用,以执行指针运算。
此类型在中声明如下:
多年来,LRESULT
类型经历了许多变化。我相信在Win64之前,它被定义为INT\u PTR
,但后来在Win64下为可移植性进行了更新。许多其他类型也经历了类似的更改,例如WPARAM
和LPARAM
,它们过去在Win16中是16位值,在Win32中是32位值,现在在Win64中是64位值
正如@ildjarn指出的,返回的实际值因windows消息上下文而异。还有一种可能性是,您正在阅读的示例源代码可能是在Win64成为一件大事之前创建的,并且自编写以来可能没有更新或检查其可移植性
为了便于移植,根据编译目标,符号的定义略有不同。因此,(INT_PTR)TRUE
更好,即使您知道应该返回的与构建匹配的确切值。返回0在返回值为空的情况下,code>可能返回正确的结果,在可移植性很重要的情况下进行编译时,这是一种糟糕的形式。使用return-1
或甚至返回0x7FFFFFFF
更糟糕,因为您可能会截断、屏蔽或以其他方式破坏所有平台编译目标的响应
使用预定义的符号和常量是最好的,因为当您更改编译目标时,正确的值和类型将被替换。我非常怀疑您是否在玩WinForms,并遇到了这段代码——WinForms是一个基于.NET的框架。@ildjarn,我在那里写了“windows forms”,但该网站将其重命名为“winforms”是出于某种原因。我还想知道它为什么会这样做,我认为它只是它的另一个别名,所以我没有费心去更改它(如果可能的话…)“windows forms”是这个的正确名称吗?“winforms”只是“windows forms”的常见缩写“但是,Windows窗体是.NET技术,这显然是本机C++。这通常被称为WinAPI代码。哦,我明白了,所以它不像我想的那么简单。我认为问题不在于类型,而在于值。值是不透明的;即使在很多情况下,1
和0
不能映射到每个平台目标的正确值。我承认,这现在令人毛骨悚然,但在十多年前,Win64的出现是一件大事。此外,这些语义对于那些习惯于编写平台可移植C的人来说仍然是一件大事。我的意思是,我认为OP是在问为什么在一种情况下返回TRUE
,而在另一种情况下(实际上)返回FALSE
。问题标题可能暗示了(INT_PTR)TRUE
或(INT_PTR)1
而不仅仅是TRUE
或1
,甚至(INT_PTR)FALSE
或(INT_PTR)0
而不是FALSE
,或者0
。原来(LRESULT)
可以与(INT_PTR)互换
在WindowProc或DialogProc中,至少通过以下步骤进行验证。