天狼鼠

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
第10章 CWinApp类

每个MFC程序都包含一个CWinApp类的实例. 它实现主事件循环并把事件分发给MFC中其他类.

10.1 成员变量

m_pszAppName       应用程序名称
m_hInstance        当前实例的句柄
m_hPrevInstance    上一个实例的句柄
m_lpCmdLine        用于调用的命令行的一个拷贝
m_nCmdShow         指定窗口初始时的显示方式
m_bHelpMode        如果应用程序处于Help文档模式则为TRUE
m_pActiveWnd       如果应用程序是OLE服务方式并且当前处于活动状态.则它指向容器主窗口
m_pszExeName       EXE文件的名称
m_pszHelpFilePath  程序的Help文件的路径
m_pszProfileName   应用程序的INI文件的名称
m_pszRegistryKey   应用程序的注册表键值

常用函数如:
AfxGetApp             返回指向应用程序的CWinApp对象的指针.
AfxGetInstanceHandle  返回应用程序的实例的句柄.
GfxGetResoureHandle   返回程序的资源的句柄.
AfxGetAppName         返回应用程序的名称.


10.2 图标和光标
载入图标使用CWinApp类的 LoadStandardIcon 和 LoadIcon 函数

LoadStandardIcon      载入系统定义的图标. 如 IDI_APPLICATION 
    IDI_HAND  IDI_QUESTION  IDI_EXCLAMATION IDI_ASTERISK

LoadIcon     载入自定义图标 .

两个函数都接收一个图标ID做参数. 如:
CApp theApp;  //全局CWinApp对象
//在某函数内:
HICON hico = theApp.LoadIcon(IDI_XXXXX);
HICON hico1 = theApp.LoadStandardIcon(IDI_HAND);
//然后就可以用图标句柄 hico 操作图标了. 如在CStatic中 cs.SetIcon(hico);


载入光标也和图标类似. 用CWinApp的成员函数 LoadCursor 和 LoadStandardCursor(系统光标) .
系统光标定义有:  IDC_ARROW(正常箭头) IDC_IBEAM(文本插入I形光标) IDC_WAIT(沙漏)等等.

要显示沙漏形光标.CCmdTarget类提供了两个函数: BeginWaitCursor和 EndWaitCursor.
这两个函数要在同一个消息处理器函数中调用.否则不能正常工作.要修改显示的缺省的沙漏图标可以
重载 CWinApp::DoWaitCursor来完成.

 
10.4 应用程序功能 (使用文档模板)

class CApp : public CWinApp {
public:
    BOOL InitInstance();
    DECLARE_MESSAGE_MAP()
};

CApp app;

class CWindow : public CFrameWnd {
    DECLARE_DYNCREATE(CWindow)
};
IMPLEMENT_DYNCREATE(CWindow, CFrameWnd)

class CDoc : public CDocument {
    DECLARE_DYNCREATE(CDoc)
public:
    void Serialize(CArchive & ar) {
         ( (CEditVieW*) m_viewList.GetHead() ) -> SerializaRaw(ar);
    }
};
IMPLEMENT_DYNCREATE( CDoc, CDocument)

class CEdView : public CEditView {
    DECLARE_DYNCREATE(CEdView)
};
IMPLEMENT_DYNCREATE(CEdView, CEditView)

BOOL CApp::InitInstance(){
    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
                     IDR_STANDARD,
                     RUNTIME_CLASS(CDoc),
                     RUNTIME_CLASS(CWindow),
                     RUNTIME_CLASS(CEdView) );
    AddDocTemplatet (pDocTemplate);

    if(m_lpCmdLine[0] == '{fckeditor}') OnFileNew();
    else OpenDocumentFile(m_lpCmdLine);
   
    return TRUE;
}

BEGIN_MESSAGE_MAP(CApp, CWinApp)
    ON_COMMAND (ID_FILE_NEW, CWinApp::OnFileNew)
    ON_COMMAND (ID_FILE_OPEN, CWinApp::OnFineOpen)
END_MESSAGE_MAP()


上边的代码可以工作.其中在CApp::InitInstance函数中调用:
    AddDocTemplatet (pDocTemplate);
它使CWinApp的模板列表中增加了一个新的文档模板.该模板指定如下内容:
1. 这个模板的一组资源 . (本例中ID号为 IDR_STANDARD)
2. 文档类
3. 窗口类
4. 视图类

posted on 2011-03-20 15:44  情有独钟  阅读(760)  评论(0编辑  收藏  举报