TN003:映射到对象的Windows句柄

此说明描述了支持可以将对象处理的 C++ 对象的 MFC 实例。

问题

window 对象由多个 处理 对象通常表示 MFC 类包装窗口对象处理用 C++ 对象。包装 MFC 类库的功能处理使您可以找到包装窗口对象具有特殊处理的 C++ 对象。但是,有时对象没有 c. C++ 包装对象,并且这些时间系统中创建一个临时对象作为 C++ 包装。

使用句柄映射的 windows 对象如下所示:

  • HWND (CWndCWnd派生类)

  • HDC (CDCCDC派生类)

  • HMENU (CMenu)

  • HPEN (CGdiObject)

  • HBRUSH (CGdiObject)

  • HFONT (CGdiObject)

  • HBITMAP (CGdiObject)

  • HPALETTE (CGdiObject)

  • HRGN (CGdiObject)

  • HIMAGELIST (CImageList)

  • SOCKET (CSocket)

将处理对上述任一对象,可以查找通过调用静态方法包装处理 FromHandle的 MFC 对象。例如命名 HWND 调用 hWnd,以下行将返回包装 hWnd的指针 CWnd :

CWnd::FromHandle(hWnd)

如果 hWnd 没有特定包装对象,临时 CWnd 创建包装 hWnd。这样就可以从任何句柄的有效 C++ 对象。

在具有包装对象之后,可以从包装类的公共成员变量中检索其处理。在 CWndm_hWnd 包含该对象的 HWND。

附加到 MFC 对象的句柄

将新创建的处理包装对象和一个句柄窗口对象,可以通过调用 Attach 功能关联两个如此示例所示:

CWnd myWnd;
myWnd.Attach(hWnd);

这使得在关联 myWnd 和 hWnd的永久映射的项。调用 CWnd::FromHandle(hWnd) 现在将返回指向 myWnd。当 myWnd 删除,析构函数将通过调用 windows DestroyWindow 功能自动销毁 hWnd 。如果这不需要,必须从 myWnd 分离 hWnd ,在销毁之前 myWnd (通常,在离开 myWnd 定义) 的范围。Detach 方法执行此操作。

myWnd.Detach();

更多有关临时对象

创建临时对象。,只要为没有包装对象 FromHandle 的句柄。这些临时对象从其处理分离并按 DeleteTempMap 函数删除。默认情况下 CWinThread::OnIdle 自动调用以支持临时句柄映射的每个类的 DeleteTempMap 。这意味着不能假定为临时对象的指针将在该指针从获取的函数退出。

包装对象和多个线程

临时和永久性对象维护每个线程基类型。即一个线程不能访问另一个线程的 C++ 包装对象,而不管它是临时或永久的。

若要通过从一个线程的这些对象传递给另一个,请始终发送它们作为其本机 HANDLE 类型。通过 c. C++ 从一个线程的包装对象到另一个经常会导致意外的结果。

请参见

其他资源

由Number "技术说明

技术说明按类别