Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 消息处理程序INT_PTR返回值的用途是什么?_C++_Visual Studio 2008_Winapi_Visual C++ - Fatal编程技术网

C++ 消息处理程序INT_PTR返回值的用途是什么?

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

我正在使用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)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可能返回正确的结果,在可移植性很重要的情况下进行编译时,这是一种糟糕的形式。使用
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中,至少通过以下步骤进行验证。