TN003:映射到对象的Windows句柄
此说明描述了支持可以将对象处理的 C++ 对象的 MFC 实例。
问题
window 对象由多个 处理 对象通常表示 MFC 类包装窗口对象处理用 C++ 对象。 包装 MFC 类库的功能处理使您可以找到包装窗口对象具有特殊处理的 C++ 对象。 但是,有时对象没有 c. C++ 包装对象,并且这些时间系统中创建一个临时对象作为 C++ 包装。
使用句柄映射的 windows 对象如下所示:
HWND (CWnd 和 CWnd派生类)
HDC (CDC 和 CDC派生类)
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++ 对象。
在具有包装对象之后,可以从包装类的公共成员变量中检索其处理。 在 CWnd, m_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++ 从一个线程的包装对象到另一个经常会导致意外的结果。