现在的位置: 首页 > 综合 > 正文

MFC学习之初体验

2013年09月23日 ⁄ 综合 ⁄ 共 2802字 ⁄ 字号 评论关闭

    学习MFC是从昨天晚上开始的,刚开始时我读的是《深入浅出MFC》,读了几篇,感觉上它讲的有那么一点太本质了。但是我还是从它那里获得了一个总体的认识。

   当我看到了更多的MFC文章时,我真的想很轻蔑地说一句:切,不就是一个封装了WINDOWS API的类库嘛!----事实上这句话没有错误,但是客观地说,MFC其实拥有更为深刻的内涵。

  不要被表面现象所蒙蔽了!我用VC6自动生成了一个基于对话框的MFC程序。好了,不要看那个象是在VB下编写程序的框框,我双击打开原代码文件,这个时候我明白,事实上MFC就只是一个类库,我觉得只要稍微改变以下,我们甚至可以直接用#include 和#pragma来用MFC写WINDOWS窗口程序!

  浏览了原代码很多遍-----呵呵--,很多东西不清楚。

  看文章,看教程,我觉得我还应该先看点表面的东西,我得对MFC程序有个大体的认识----例如怎样去做个程序啦之类的。

  在看文章的过程中,我对比着那分原代码看,今天看了些消息映射的文章。

  于是一时头热,自己捣鼓起原代码----没有用ClassWizard---呵呵,弄了个消息处理函数,居然成功了。我开始惊叹起自己的能力来,自言自语道:太夸张了,真的是到了一定的境界后,自己不看书都可以悟出原理来~~~(哈哈,让高手见笑了~)

 

   我的大胆做法:

   开始在CGggApp类里加入afx LRESULT MouseMsg....想在主窗体上点击鼠标时调用它,结果不行---于是又看到还有一个CGggDlg类,我用对话框的形式测试了一下,发现程序会调用这个类的一些成员函数---于是很粗略地猜测,CGggApp可能就是负责程序内核的东西的,而CGggDlg是负责外观上的可以看到的~~

  于是:

   在CGggDlg里加入消息处理函数的声明- afx_msg LRESULT MouseMsg(WPARAM wParam,LPARAM lParam);
  在CPP文件里的消息映射那里加入消息映射宏(CGggDlg有两个这个东西,只需要看BEGIN_MESSAGE_MAP(CGggDlg, CDialog)):

  ON_MESSAGE(WM_LBUTTONDOWN,MouseMsg)

  然后再定义那个函数:

afx_msg LRESULT CGggDlg::MouseMsg(WPARAM wParam,LPARAM lParam)
{
 AfxMessageBox("Now in the MouseMsg function");

 return 0;
}

 

 

F7~~~恩  就成功了~~运行程序看看,效果完全达到~~~OK  是个好的开头~~

 

PS:13:30

   在网上翻到一篇文章,一看,吓我一跳,我的所谓“甚至可以直接用#include 和#pragma来用MFC写WINDOWS窗口程序”居然是正确的,还真有人这样写程序的!我把他的示例程序复制到VC下,(这里不是#pragma(comment,"***.lib")--也许只要找到相应的LIB就可以)选择using MFC int a static library~~编译成功,连接也成功~~汗~为什么又要我给 猜对了!

  话说回来,刚开始时,我确实为我的想法感觉纳闷。如果真的可以#include 来写MFC程序的话,那么那个说明MFC类库的头文件又在哪里被包含了呢?----当时我郁闷了一下,也没有深究下去------毕竟用MFC的人哪个会去不用那些Wizard?后来一不小心打开 stdafx.h文件------总以为它是用来处理预编译的,没想到就在那里面,包含了我猜测到的头文件------afxwin.h!

PS:22:08

  现在我已经基本上知道了MFC程序的大致执行过程,以及大致的框架。

 MFC不仅仅是一个封装了WINDOWS API的类库,它还提供了一层建立在Windows APIC++封装上的附加应用程序框架。它封装了WinMain函数----我们知道,WINDOWS窗口程序就是从WinMain执行的----在SRC目录下有两个文件AppModul.cpp和WinMain.cpp,好象是给出了一些内部的定义----他们不是程序编译连接的必须品,我试着把那两个文件给删掉,编译连接依然OK!

  然后一个基于MFC的程序必须有一个从CWinApp派生而来的类。为什么必须派生CWinApp类?因为应用程序执行时,系统会调用 CWinApp的派生类的重载InitInstance成员函数(方法)-----假如是调用CWinApp的InitInstance的话,那用户又如何去做一些程序的初始化工作?所以为了自定义一些初始化工作,我们必须改写InitInstance函数,怎么改写?难不成直接修改CWinApp类?拜托,该类已经被MS封装在dll 和lib里了---当然假如有可以修改的CPP文件,在面向对象编程里我们也是不提倡的。所以我们必须去重载那个函数,于是就新建个类,派生于 CWinApp类,然后就可以重载那个函数了!---(这是我的理解,理解错了还请高手指正~)

 有了这个类后(假如;类名为CMyApp),程序里还的有个且只能有一个全局的CMyApp对象,在这个对象的InitInstance里我们需要处世化窗口对象。

  窗口类也是必须的,MFC提供了三个类CFrameWnd、CMDIFrameWnd(也需要CMDIChildWnd)和CDialog 分别用于支持单文档窗口、多文档窗口和对话框。我们也需要自己做个类从那几个类里派生出常用的方法。为什么要派生?理由和上面的差不多,就是为了实现自己需要的功能。

  有了窗口类后,我们就可以在CMyApp的InitInstance里建立这个窗口类的对象了。创建了窗口对象后还需要创建窗口,这个简单,只需要调用一写它的Create方法,传几个参数就可以了---偶有SDK基础,这对于我而言很简单!有了窗口,就可以开始消息循环了。(真的,建议初学者学MFC前一定要有SDK(就是WINDOWS API)和C++基础,学起来巨简单,掌握了大致的框架,剩下的就是学习一些系统技术了。)

  整个程序框架就是:创建一个派生于CWinApp的类的对象---->进入WinMain--->调用一些初始化函数(或方法)例如InitInstance--->创建窗口对象---->消息循环(调用CWinApp或其派生类的Run方法)--->结束,退出消息循环,执行CWinApp或其派生类的ExitInstance方法--->销毁对象

 PS:23:38

  在接下来的计划里,我决定先用MFC做几个程序,先熟悉一下,这样可以更深入地理解它。然后我还需要练习一些C++的高级特性----什么是学的快忘的快?这个在偶身上体现的非常明显--HOHO~

  练习MFC,我想我还是会基于对话框类型的。OK~~GO ~

 

抱歉!评论已关闭.