2009-9-2
===========================
《深入解析MFC》笔记 2. MFC基础
===========================
基本的MFC应用程序组件:
CWinApp:应用程序对象
· 保存了一些传递给WinMain()的命令行参数,包括当前实例的句柄(m_hInstance)、前一个实例的句柄(m_hPrevInstance)、命令行参数(m_lpCmdLine)以及显示窗口标志(m_nCmdShow)。
· CWinApp在m_pszAppName中保存了应用程序名字的拷贝。
· m_pszExeName(指向可执行文件名字的指针)、m_pszHelpFilePath(指向应用程序帮助文件路径的指针)、以及指向应用程序配置文件(profile)名字的指针
· CCommandLineInfo结构用来保存命令行参数
· MFC中,实例的初始化有CWinApp::InitInstance()完成。
· 关闭程序和清除资源由ExitInstance()完成。
· 调用CWinApp::Run()会启动标准的GetMessage()...DispatchMessage()循环
· 每当消息队列为空时,CWinApp::Run()会调用OnIdle()。
CWnd:窗口基类
包装Windows API
m_hWnd成员变量表示API级的窗口句柄(HWND)。
将窗口句柄转化成窗口对象
CHandleMap:没有文档说明的窗口句柄映射表类
将窗口句柄映射成MFC的Windows对象。
CMapPtrToPtr m_permanentMap: 表示永久映射表,保存程序运行过程中句柄/对象映射表。
每当创建一个CWnd的派生类,MFC都会再永久目录下插入一条映射记录。调用CWnd::OnNcDestroy()时就会从永久目录下删除一条映射记录。
CMapPtrToPtr m_temporaryMap:表示临时映射表,仅在消息存在的过程中存在。
除CWnd派生对象与HWND之间的映射外,还有4个从MFC类到本地窗口句柄的映射。
AFX_MODULE_THREAD_STATE结构
· m_pmapHWND: 窗口句柄与CWnd对象之间的映射表
· m_pmapHMENU: 菜单句柄到CMenu对象的映射表。
· m_pmapHDC: 设备环境句柄到CDC对象的映射表。
· m_pmapHGDIOBJ: GDI对象句柄到CGDI对象的映射表。
· m_pmapHIMAGELIST: 图象链表句柄到CImageList对象的映射表
每个参与了句柄映射方案的MFC类都包括一个FromHandle函数,该函数将CHandleMap::FromHandle()包装了起来,CHandleMap::FromHandle()完成了查找,并将一个本地句柄与一个C++对象相关联。CWnd::FromHandle()会返回一个适当类型的对象。
关联窗口句柄和分离窗口句柄
CWnd::Attach() 将CWnd::m_hWnd赋值为已有的窗口句柄,并将这队关系存放在MFC的永久窗口句柄映射表中。
CWnd::Detach() 将窗口关系和CWnd派生对象之间的关系从窗口句柄映射表汇总删除,将CWnd::m_hWnd的值设为NULL.
MFC状态信息
AFX_MODULE_STATE:没有文档说明的状态信息
· m_pCurrentWinApp—— 一个纸箱CWinApp的指针
· m_hCurrentInstanceHandle —— 该模块的实例句柄
· m_hCurrentResourceHandel —— 代表保存了模块资源的实例句柄
· m_lpszCurrentAppName —— 指向应用程序名称的指针
· m_bDLL —— 表示模块是一个动态链接库还是一个可执行文件
· m_classList—— 指向应用程序的CRuntimeClass结构链表中的第一个运行时类的指针。
· m_factoryList —— 纸箱应用程序的 COleObjectFactory结构链表中的第一个运行时类的指针
· m_nObjectCount—— OLE服务器的引用计数,表示服务器是否有未完成的COM对象
· m_bUserCtrl —— 表示拥护是否在使用OLE服务器的标志。
· m_szUnregisterList[4096]——维护一个注册了的窗口类的链表,以便结束时的注销
· m_pfnAfxWndProc —— 指向MFC的标准窗口过程
· m_fRegisteredClasses——表示哪些MFC窗口类已经注册了。
多数成员可以通过类似AfxGetInstanceHandle()来访问。
MFC对GDI的支持
CDC类内部
HDC成员变量,表示一个实际设备环境的句柄。
m_hAttribDC,
CDC析构函数调用DeleteDC()。
CDC派生类
· CPaintDC —— CPaintDC的构造函数需要一个指向CWnd的指针,他会调用BeginPaint()而创建一个设备环境,然后写入设备环境映射表。CPaintDC的析构函数是EndPaint()。
· CWindowDC —— 表示窗口内的整个屏幕区域(包括用户区和框)。CWindowDC的构造函数需要一个指向CWnd的指针,调用GetWindowDC()来为整个窗口创建一个设备环境。CWindowDC的析构函数是ReleaseDC()。
· CClientDC——用户区。构造函数也需要一个指向CWnd的指针。GetClientDC()、ReleaseDC().
· CMetaFileDC —— Windows的元文件有一个GDI命令序列,利用这个命令序列可以重新画出图像。创建一个元文件DC:构造CMetaFileDC(在栈中分配一个或声明一个),然后调用CMetaFile::Create()来创建一个元文件并初始化CMetaFile的成员变量,析构函数:DeleteMetaFile()。
图形对象
Device context 保存了在Windows绘画所需要的所有信息,包括映射模式等等。还保存了关于在设备上绘画所使用的工具的信息。
CGDIObject
所有GDI对象的基类。m_hObject是GDI对象的句柄。
CPen
CBrush
CFont
CBitmap
Cpalette
CRgn
posted on 2010-03-15 23:00
Euan 阅读(734)
评论(0) 编辑 收藏 引用 所属分类:
windows