【发布时间】:2014-04-04 00:48:51
【问题描述】:
为什么 Windows 中的某些函数需要 pWnd 参数而其他函数需要 HWND 参数?示例:
// Get a dc for a CWnd object pointer.
CPaintDC dc(pWnd);
// Send my private massage.
::SendMessage(pWnd->m_hWnd, WM_MYMESSAGE, (LPARAM) &dc.m_ps, 0);
实际上,为什么 Windows 会有pWnd 和HWND 这两种类型?
由于HWND可以通过pWnd->m_hWnd得到,所以函数总是可以一直以pWnd为参数。其背后的设计理念是什么?
【问题讨论】:
-
我的猜测(这只是一个猜测)是一些采用 HWND 的 API 先出现并为向后兼容而维护。后来的 API 使用了 pWnd 构造,它封装了 HWND,但也提供了更多信息。
-
第一个函数是特定于 MFC 的,因此它可能需要特定于 MFC 的参数。第二个不是 MFC 功能所以不能。
-
顺便说一句,您可以使用 CWnd 包装器发送消息,如下所示:
pWnd->SendMessage(WM_MYMESSAGE, (LPARAM) &dc.m_ps, 0); -
@Eric 你可能希望以后不要再猜测了。特别是如果您对手头的主题没有丝毫线索。没有一个 Windows API 需要
CWnd- 甚至没有任何 C++ 类。 Windows API 有一个 C 接口。CWnd是类库的一部分(如 MFC、WTL 或其他)。
标签: windows visual-studio winapi visual-c++ mfc