上次已经搭建了最简的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
阅读(2649) | 评论(0) | 转发(0) |