2014.9.17

来源:互联网 发布:mac和windows快捷键 编辑:程序博客网 时间:2024/04/29 13:31

1、深入浅出MFC的学习

在程序进入点之前,还有一个(而且仅有一个)全局对象(一般为the App),这就是所谓的application object ,当操作系统讲程序加载并激活时,这个全局对象活的配置,其构造函数会先执行,比WinMain更早。

CWinApp代表程序本体,CFrameWnd代表一个主框窗口(Frame Window)

CWinApp的派生对象被称为application object,可以想见,CWinApp本身就代表一个程序本体

传统上SDK程序的WinMain所完成的工作现在由CWinApp的三个函数完成: InitApplication()、InitInstance()、Run();


实验:

新建立一个命名为VoidName的基于对话框的MFC工程项目,其中在头文件VoidName.h中,有以下基础代码

class CVoidNameApp : public CWinApp
{
public:
CVoidNameApp();

// 重写
public:
virtual BOOL InitInstance();

// 实现

DECLARE_MESSAGE_MAP()
};

extern CVoidNameApp theApp;

通过此实验说明,CWinApp为MFC框架程序,即书中所讲程序的主体


在VoidName.cpp中,有如下代码:

BOOL CVoidNameApp::InitInstance()
{
// 如果一个运行在 Windows XP 上的应用程序清单指定要
// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// 将它设置为包括所有要在应用程序中使用的
// 公共控件类。
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);

CWinApp::InitInstance();

AfxEnableControlContainer();

// 标准初始化
// 如果未使用这些功能并希望减小
// 最终可执行文件的大小,则应移除下列
// 不需要的特定初始化例程
// 更改用于存储设置的注册表项
// TODO: 应适当修改该字符串,
// 例如修改为公司或组织名
SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

CVoidNameDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 在此处放置处理何时用“确定”来关闭
// 对话框的代码
}
else if (nResponse == IDCANCEL)
{
// TODO: 在此放置处理何时用“取消”来关闭
// 对话框的代码
}

// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
// 而不是启动应用程序的消息泵。
return FALSE;
}
以上代码为CVoidNmaeApp中InitInstance函数的重写,即在自己编写的应用程序中,必须将InitInstance重写,但在源文件中已经将该框架搭好,如果需要,程序员应当在此函数中添加初始化信息。


在新建立的此工程中,有头文件:VoidName.h、VoidNameDlg.h以及源文件VoidName.cpp、VoidNameDlg.cpp

在VoidName.h的开头中写有“// VoidName.h : PROJECT_NAME 应用程序的主头文件”即说明此头文件为该项目的原始文件,而VoidNameDlg.h则为关于初始化产生的对话框的头文件。即如果再添加新的对话框,则会添加新的头文件和源文件:XXXXDlg.h、XXXXDlg.cpp


如上,今天一下午加一晚上浑浑噩噩、断断续续的看书学习,以及自己做的最low的小实验的小结,不管怎样,总算对MFC的基础框架有星星点点的了解,希望自己在可以应用的基础上,尽量了解MFC的内部机制,无论MFC的应用如何,起码对于学习来说,本身就是大有裨益的吧。



0 0
原创粉丝点击