随笔-19  评论-2  文章-0  trackbacks-0

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

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理