我正在寻找关于这个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程序员,但看起来这些整数只是被用作“缓冲区”,程序员后来在使用之前将其转换为“真实”类型......声音准确吗?
答案 0 :(得分:2)
这种编程风格“糟糕”,因为无法在编译时知道真正的内容。也就是说,由于WIN32 API是一个C API(而不是C ++),当人们想要使用相同的方法签名传递任何类型的结构时,没有太多可以做的事情。
因此,API设计团队决定使用两个参数来处理这个问题。一个32位LPARAM
和一个16位WPARAM
。
使用Win32 C API时,您只需要确保正确阅读文档,并确保您正在使用文档所说的。
所以回答你的问题,你是对的 - 但这只是因为你别无选择。为了在这里完成,MFC出现了(对于C ++程序员),但这不是一个好的面向对象的库 - 它更像是一个包装器。还有其他人做得更好(例如wxWidgets)。