当前位置:文档之家› 第六章 框架中的窗口

第六章 框架中的窗口

这些成员函数先用afxMapHWND得到CHandleMap的指针, 再进行相关操作(实现见p174-175)。
Class CWnd : public CCmdTarget // _AFXWIN.H 文件
{ … // 其他成员
afxMapHWND(TRUE)被用来获得该线 程的CHandleMap对象* pMap ,由此调
return m_permanentMap[h] = pOb; }
6
将消息发送给不同的窗口
7
窗口句柄映射
Windows为每个线程维护一个消息队列
每个线程执行过程中消息处理函数AfxWndProc只能收到 本线程中的窗口发来的消息,窗口的句柄映射应该是线 程私有;
因此记录窗口句柄映射的CHandleMap对象定义在模块线 程状态类AFX_MODULE_THREAD_STATE中:
static CWnd* FromHandle(HWND hWnd)用; Fmr_opmeHrmanadnleen(htMWanpd[)h函] 指数针得到
sCtaWtincdC* CWWnndd*::FFrroommHaHnadlne(dHleWPNeDrmhWannedn) t(HWND hWnd);
{
// 通过hWnd找到对应的 CWnd 指针
CWnd *pWnd = CWnd::FromHandlePermanent(hWnd);
ASSERT(pWnd != NULL);
ASSERT(m_pWnd = pWnd);

// 将消息交给 CWnd 对象处理
return pWnd ->WindowProc(nMsg, wParam, lParam);
{
pState -> m_pmapHWND = necwlasCsHAaFnXd_leMMOaDp(U);LE_THREAD_STATE: …
return pState -> m_pmapHWN{ D;
}

}
CHandleMap *m_pmapHWND

}
9
窗口句柄映射管理
以下四个成员函数用于管理窗口句柄映射。
记录窗口句柄到CWnd对象指针的映射关系 窗口函数是全局函数,命名为AfxWndProc 接受消息成员函数为自定义回调函数WindowProc AfxWndProc基本构架为:
5
AfxWndProc
LRESULT_stdcall AfxWndProc(HWND hWnd, UNIT nMsg, WPARAM wParam LPARAM lParam)
afxMapHWND 用于访问当前线程中窗口句柄映射。
CHandleMap*afxMapHWND(BOOL bCreate=FALSE)
{
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
if(pState ->m_pmapHWND == NULL&& bCreate )
}
hWnd
BOOL Attach(HWND hWndNew) // p174,184 {…
pMap->SetPermanent(hWndNew, this); } // hWnd = CreateWinowEx(); p187
Void SetPermanent(HANDLE h, CObject * pOb); {
Class CCmdTarget:public CObject
{
DECLARE_DYNCREATE(CCmdTarget);
public:
=>>static new CCmdTarget;
CCmdTarget();
};
// 这个类的代码在 CMDTARG.CPP文件中
// 创建此文件,添加如下代码:
class AFX_MODULE_THREAD_STATE:public CNoTrackObject
{

// 窗口句柄映射
CHandleMap *m_pmapHWND;
};
8
窗口句柄映射
m_pmapHWND指针所指向的CHamdleMap(见p161 Winhand.h)对象记录本模块当前线程的窗口句柄映射。
3
CWnd类的实现代码
//WINCORE.CPP #include “_afxwin.h” #include “winhand.h” CWnd::CWnd(); {
m_hWnd=NULL; // 句柄只能够从创建的窗口获得,所以初始化为空 } CWnd::~CWnd() {
if(m_hWnd!=NULL) {
第 框架程序提供了CWnd类封装窗口的HWND句柄,使用CWnd 来管理窗口的对象:包括窗口的创建、销毁、窗口的一 般行为和窗口所接受的消息;
封装CCmdTarget类作为消息处理的终点,使其它由此派 生的类也有处理消息的机会;
两typ个ed类ef v的oi构d (A架F如X_下MS:G_CALL CCmdTarget::*AFX_PMSG)(void);
::DestroyWindow(CWnd, CCmdTarget); } } IMPLEMENT_DYNCREATE(CWnd, CCmdTarget);
4
窗口句柄映射
一个线程中可能不只一个窗口,因此会有多个对应的 CWnd对象,每个CWnd对象只响应发给本窗口的消息
安排一个窗口函数找到处理该消息的CWnd对象地址, 再把它交给此CWnd对象
// IMPLEMENT_DYNCREATE(CCmdTarget, CObject)
// CCmdTarget::CCmdTarget(){ }
2
CWnd类的定义
Class CWnd : public CCmdTarget {
DECLARE_DYNCREATE(CWnd) Public
CWnd(); virtual ~CWnd(); HWND m_hWnd; operator HWND() const {return m_hWnd;} HWND GetSateHwnd(){return this==NULL?NULL : m_hWnd;} }; // 当然CWnd类远远不止这些成员, 详细内容见_AFXWIN.H和 // WINCORE.H
相关主题