【问题标题】:Windows Programming: pWnd and HWND differenceWindows 编程:pWnd 和 HWND 的区别
【发布时间】: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 会有pWndHWND 这两种类型?

由于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


【解决方案1】:

Windows 中没有一个函数采用CWnd*(您称之为pWnd)。 Windows(尤其是user32.dll)专门使用HWND 来识别窗口对象。

class CWnd 是 MFC 的一部分,它是一个构建在 Windows 之上的 C++ 库。只有 MFC 以及使用 MFC 编写的类和函数才能知道那是什么。

(还有以前称为 Metro 的 Modern UI,它没有上述任何内容。它也不使用user32.dll。但这是另一个话题。)

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 2016-07-09
    • 2017-06-01
    • 1970-01-01
    • 2013-02-13
    • 2010-09-06
    • 1970-01-01
    • 2010-10-06
    • 2013-12-10
    相关资源
    最近更新 更多