1.5 MFC封装思想
2015-08-26 17:19
295 查看
**************************************************
* 本文由小鸟飞飞整理发表 <samboy@sohu.com> *
* 首发网站:蓝丽网 *
* 其他网站转载请保留以上信息,谢谢! *
**************************************************
出差回来,继续加班,找点时间,发一节讲义。过几天还要出差,不知道又得什么时候能回来,唉,也不知道这讲义什么时候能发完。原来打字真的很累。
MFC思想博大精深,不是一节讲义可以说明白的,这里只是给大家提供一个理解的思路。另外,要想更好的理解MFC的思想,需要用到C++的一些知识,主 要是类的定义、函数重载、构造函数与析构函数、类的继承、虚函数、多态性以及数据类型的转换,如果这些还不太清楚,先看看C++吧。
MFC与传统的Windows程序的主要区别在于封装,还记得我们前几节的SDK创建窗口的程序吧。现在就以这个程序为基础,介绍一下MFC的封装特性。
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
// 第一步:设计窗口
// 第二步:注册窗口
// 第三步:创建窗口
// 第四步:显示窗口
// 第五步:消息循环
}
限于篇幅,就不写完整的代码了。该段代码主要有三个部分组成:设计窗口中 (第一步)、注册及创建显示窗口(第二、三、四步)、消息循环(第五步)
MFC中采用了面象对角的思想,即用面向对象的C++思想对 以上代码进行了封装,也就是说将一些对窗口进行操作的API函数封装到一个类中。下面我们进行第一步封装。
class CMyWnd
{
public:
HWND m_hWnd;
BOOL Create();
BOOL ShowWindow();
};
BOOL CMyWnd::Create()
{
// 第一步:设计窗口
// 第二步:注册窗口
// 第三步:创建窗口
}
BOOL CMyWnd::ShowWindow()
{
// 第四步:显示窗口
}
此时WinMain函数形式如下:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
CMyWnd m_hWnd;
m_hWnd.Create();
m_hWnd.ShowWindow();
// 第五步:消息循环
}
第二步封装:
class CMyApp
{
public:
cMyWnd * m_pMainWnd;
BOOL InitInstance();
BOOL Runt();
CMyApp();
}
CMyApp::CMyApp()
{
if(InitInstance())
Run();
}
BOOL CMyApp::InitInstance()
{
CMyWnd m_wnd;
m_pMainWnd = &m_wnd;
m_pMainWnd->Create();
m_pMainWnd->ShowWindow();
return TRUE;
}
BOOL CMyApp::Run()
{
// 消息循环
return TRUE;
}
CMyApp theApp; // 全局变量
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
m_hInstance = hInstance; // 这里的代码好像有点问题,可能运行不过去,因为不影响讲解,我就没有调试。
}
这样一来,在WinMain函数中的代码就只有 几行了,而且每个程序都是一样的,所以MFC就将WinMain函数封装起来了,因此我们在MFC的工程里找不到WinMain函数。
WinMain函数不需要自己写了,同时Run函数在所有程序中也是一样的,只要基类实现了,其子类可以自动继承,也就是说一般的程序设计我们仅仅需要实 现InitInstance函数,这也是MFC程序的入口点。
以上只是一个代码游戏,不过可以很好的说明MFC类库的封装思想,要想 熟练使用MFC编程,还需要更深入的了解MFC。
* 本文由小鸟飞飞整理发表 <samboy@sohu.com> *
* 首发网站:蓝丽网 *
* 其他网站转载请保留以上信息,谢谢! *
**************************************************
出差回来,继续加班,找点时间,发一节讲义。过几天还要出差,不知道又得什么时候能回来,唉,也不知道这讲义什么时候能发完。原来打字真的很累。
MFC思想博大精深,不是一节讲义可以说明白的,这里只是给大家提供一个理解的思路。另外,要想更好的理解MFC的思想,需要用到C++的一些知识,主 要是类的定义、函数重载、构造函数与析构函数、类的继承、虚函数、多态性以及数据类型的转换,如果这些还不太清楚,先看看C++吧。
MFC与传统的Windows程序的主要区别在于封装,还记得我们前几节的SDK创建窗口的程序吧。现在就以这个程序为基础,介绍一下MFC的封装特性。
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
// 第一步:设计窗口
// 第二步:注册窗口
// 第三步:创建窗口
// 第四步:显示窗口
// 第五步:消息循环
}
限于篇幅,就不写完整的代码了。该段代码主要有三个部分组成:设计窗口中 (第一步)、注册及创建显示窗口(第二、三、四步)、消息循环(第五步)
MFC中采用了面象对角的思想,即用面向对象的C++思想对 以上代码进行了封装,也就是说将一些对窗口进行操作的API函数封装到一个类中。下面我们进行第一步封装。
class CMyWnd
{
public:
HWND m_hWnd;
BOOL Create();
BOOL ShowWindow();
};
BOOL CMyWnd::Create()
{
// 第一步:设计窗口
// 第二步:注册窗口
// 第三步:创建窗口
}
BOOL CMyWnd::ShowWindow()
{
// 第四步:显示窗口
}
此时WinMain函数形式如下:
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
CMyWnd m_hWnd;
m_hWnd.Create();
m_hWnd.ShowWindow();
// 第五步:消息循环
}
第二步封装:
class CMyApp
{
public:
cMyWnd * m_pMainWnd;
BOOL InitInstance();
BOOL Runt();
CMyApp();
}
CMyApp::CMyApp()
{
if(InitInstance())
Run();
}
BOOL CMyApp::InitInstance()
{
CMyWnd m_wnd;
m_pMainWnd = &m_wnd;
m_pMainWnd->Create();
m_pMainWnd->ShowWindow();
return TRUE;
}
BOOL CMyApp::Run()
{
// 消息循环
return TRUE;
}
CMyApp theApp; // 全局变量
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE
hPrevInstance,
LPSTR
lpCmdLine,
int
nCmdShow)
{
m_hInstance = hInstance; // 这里的代码好像有点问题,可能运行不过去,因为不影响讲解,我就没有调试。
}
这样一来,在WinMain函数中的代码就只有 几行了,而且每个程序都是一样的,所以MFC就将WinMain函数封装起来了,因此我们在MFC的工程里找不到WinMain函数。
WinMain函数不需要自己写了,同时Run函数在所有程序中也是一样的,只要基类实现了,其子类可以自动继承,也就是说一般的程序设计我们仅仅需要实 现InitInstance函数,这也是MFC程序的入口点。
以上只是一个代码游戏,不过可以很好的说明MFC类库的封装思想,要想 熟练使用MFC编程,还需要更深入的了解MFC。
相关文章推荐
- ASP.NET数据绑定方法集合
- hdu 2489 漫步校园
- [MySQL] 主流存储引擎介绍
- C++与Java虚函数的区别
- 伪静态规则写法RewriteRule-htaccess详细语法使用
- linux 显示文本隐藏字符的方法
- 什么是L2 frame?
- 坚定的基本面分析逻辑
- jQuery学习笔记之二——常规选择器
- 安卓5.0新特性之Palette
- iOS开发——网络篇——数据安全(MD5),HTTPS,检测网络状态
- epoll测试实例
- android去掉顶部标题栏
- 我是菜鸟:java并发编程
- C# XML文件操作
- TextWatcher限制字数,避免栈溢出
- UI - UIGestureRecognizer 手势
- 【使用JSOUP实现网络爬虫】从一个URL加载一个Document
- arcgis for javasscript划线
- Android framework系统默认设置修改