Chinaunix首页 | 论坛 | 博客
  • 博客访问: 267991
  • 博文数量: 45
  • 博客积分: 1618
  • 博客等级: 上尉
  • 技术积分: 530
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-11 10:13
文章分类

全部博文(45)

文章存档

2012年(1)

2011年(25)

2010年(19)

我的朋友

分类: C/C++

2011-02-22 21:48:22

上次已经搭建了最简的MFC程序,并且看到了MFC动态创建类的基本方法,下面是将上一个程序构造出一个SDI程序,我只添加必须代码,凡是不必须的都不添加
上面已经创建可框架类,为了完成SDI的最低要求还需要创建一个视图类,用向导生成即可

#pragma once
// CBridgeView 视图
class CBridgeView : public CView

{
    DECLARE_DYNCREATE(CBridgeView)
protected:
    CBridgeView(); // 动态创建所使用的受保护的构造函数
    virtual ~CBridgeView();
public:
    virtual void OnDraw(CDC* pDC); // 重写以绘制该视图
#ifdef _DEBUG
    virtual void AssertValid() const;
#ifndef _WIN32_WCE
    virtual void Dump(CDumpContext& dc) const;
#endif
#endif
protected:
    DECLARE_MESSAGE_MAP()
    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
};

一个文档类

#pragma once
// CBridgeDoc 文档
class CBridgeDoc : public CDocument
{
    DECLARE_DYNCREATE(CBridgeDoc)
public:
    CBridgeDoc();
    virtual ~CBridgeDoc();
#ifndef _WIN32_WCE
    virtual void Serialize(CArchive& ar); // 为文档 I/O 重写
#endif
#ifdef _DEBUG
    virtual void AssertValid() const;
#ifndef _WIN32_WCE
    virtual void Dump(CDumpContext& dc) const;
#endif
#endif
protected:
    virtual BOOL OnNewDocument();
    DECLARE_MESSAGE_MAP()
};

还是在应用程序类里面的InitInstance()函数里面添加一些初始化代码,上篇文章介绍的框架类创建代码需要去掉,在SDI中框架类的实现是在下面代码中动态创建的,如下:

BOOL CBridgeApp::InitInstance()
{
/*    CRuntimeClass* pRuntimeClass = RUNTIME_CLASS(CBridgeWindow);
    //CBridgeWindow必须有一个缺省构造函数
    CObject* pObject = pRuntimeClass->CreateObject();
    //用IsKindOf检测是否是CBridgeWindow类的实例
    ASSERT(pObject->IsKindOf(RUNTIME_CLASS(CBridgeWindow)));
    m_pMainWnd =(CWnd *) pObject;*/


    // 初始化 OLE 库

/*    if (!AfxOleInit())
    {
        AfxMessageBox("OLE init Error");
        return FALSE;
    }*/


    CSingleDocTemplate* pDocTemplate;

    pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,
    RUNTIME_CLASS(CBridgeDoc),
    RUNTIME_CLASS(CBridgeWindow), // main SDI frame window
    RUNTIME_CLASS(CBridgeView));
    if (!pDocTemplate)
    return FALSE;
    AddDocTemplate(pDocTemplate);
    // 分析标准 shell 命令、DDE、打开文件操作的命令行
    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);
    SetRegistryKey(_T("最简SDI模拟"));//如果没有这句将会DEBUG(断言)错误
    //LoadStdProfileSettings(0); // 加载标准 INI 文件选项(包括 MRU)
    // 用 /RegServer、/Register、/Unregserver 或 /Unregister 启动应用程序,则返回 FALSE。
    if (!ProcessShellCommand(cmdInfo))//所有框架类等将会在该函数创建
        return FALSE;
    m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED);
    m_pMainWnd->UpdateWindow();
    return TRUE;
}

为了程序结构更加清晰,我将应用程序类CBridgeApp的声明有单独提到了一个头文件中,其实MFC的应用程序向导就是这么做的。
有代码看到,我们使用了IDR_MAINFRAME这个宏定义的资源,所以我们需要添加一个资源文件,并在里面定义该资源,同样可以有向导完成该工作。
注意在该类中包含视图类等的头文件,现在编译即可通过,但是运行的时候提示空文档创建失败,网上有一篇介绍不错的,只要有耐心自己慢慢跟踪即可,就是一定要添加一些资源,如果只是想让他出现界面的话,就只需要添加一个MENU资源,注意其ID一定是IDR_MAINFRAME,同样,可以添加icon,toolbar等资源,ID也是一样的,现在运行即可出现最简SDI
阅读(2647) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~