2

我正在寻找有关此 Windows 编程习语的确认,我认为许多不同类型的“句柄”不仅作为 LRESULT 对象而且作为 lParam 和 wParam 对象传递,这是否正确?

我猜,只要我们知道 LRESULT 或 lParam/wParam 中的“什么”类型的句柄,我们就可以将其转换回它。

例如

case WM_CREATE:
   ...
   //create a window
   //lParam is the CREATESTRUCT for new window created here
   ....
   return lParam;
...
...
CREATESTRUCT cStruct = (CREATESTRUCT)SendMessage(hwnd, msg /*WM_CREATE*/);
cStrcut.cx;//this is the width of the new window?

正确的?

这是“正确的”吗?任何人都可以为我和 StaticOverflow 社区提供关于这种技术/习语的简短论文吗?

问题:我们应该只返回 lParam(或只返回 wParam)值吗?有没有应该知道的陷阱?LRESULT 和 LPARAM 都是 LONG_PTR 类型,它们是 32 位或 64 位整数。我不是一个经验丰富的 C 程序员,但似乎这些整数只是被用作“缓冲区”,程序员后来在使用之前将其转换为“真实”类型......听起来准确吗?

4

1 回答 1

2

这种编程风格是“糟糕的”,因为在编译时无法知道某些东西到底是什么也就是说,由于 WIN32 API 是一个 C API(而不是说 C++),当一个人想要使用相同的方法签名传递任何类型的结构时,没有什么可以做的。

因此,API 设计团队决定使用两个参数来处理这个问题。一个 32 位LPARAM和一个 16 位WPARAM.

使用 Win32 C API 时,您只需要确保正确阅读文档并确保您正在转换到文档所说的正确内容。

因此,要回答您的问题,您是正确的-但这只是因为您别无选择。为了在这里完成,MFC 出现了(针对 C++ 程序员),但这并不被认为是一个好的面向对象的库——它更像是一个包装器。还有其他的做得更好的(例如wxWidgets)。

于 2013-04-21T07:58:25.247 回答