随笔-4  评论-9  文章-0  trackbacks-0

                                                                              MFC学习笔记
MFC :
 每个MFC程序都有一个CWinApp类的派生类,还应该有个CWnd类派生类,也就是必须有应用程序类,和窗口类。
CWinApp类的作用:
 CWinApp是一个基类,你通过它来继承Windows应用程序对象。应用程序对象为你提供了初始化应用程序(以及它的每一个实例)和运行应用程序所需的成员函数。在可重载函数InitInstance 中实例初始化,比如创建窗口对象;你也可以在这个函数中调用CDialog类的派生类创建对话框程序。应为这个类当中封装了WInMain函数,这个函数大家不陌生吧。

下面再说说CWnd类的派生类的作用吧。

CWnd类的作用:
CWnd类是所用窗口的基类,一个有窗口的windows的程序都应该有这个类的派生类,比如对话框类,调色板类,都是这个类的派生类,还有比如按钮类,编辑框类也都是这个类的派生类。咱们在用AppWizard生成的单文档窗口的视类也是这个类的派生类。
总的来说就是一句话,窗口程序肯定有这个类的派生类(MFC编程,SDK除外)。

现在我讲讲消息MFC处理:
MFC的消息和用SDK编程中的消息种类是一样的,只不过是写法不一样了而已,初学MFC编程的人肯定觉得很别扭,不知道该怎么去做,有的MFC书上的ClassWizard添加消息,重载函数,可没有讲原因,或许那些作者觉得没有这个必要,也许觉得这个板块很大,知识很杂,想在书中慢慢讲解,可这样就苦了读者了,我深受其苦,我想用SDK编程过的人都是知道WindowProc函数吧,这是窗口过程函数,SDK编程大部分都是在这个模块里写的,功能都是在这个模块里实现的。讲了这么多我现在教初学者从SDK编程消息机制中的思维转化到MFC编程的消息机制。
我前文说过SDK与MFC的消息是一样的,剩下的就是怎么理解消息的运转,我用代码来讲解,会更加直观,便于理解:
这个是在类中描述消息的  大家看着很眼熟吧,可是为什么多了一个On前缀呢?这个是一个命名规则,就是这些函数都可以重载,一般这些函数在protected:中;大家可以看看吧;对了最后那个像宏一样的东西是啥啊,这个就是声明消息映射,在自己写MFC类时也要写的,不要忘掉;afx_msg这个前缀是很重要的,他是区分这个是不是类成员函数,也就是说自己定义的函数是没有这个前缀的,很重要的东西。MFC的映射这个板块的东西是开头,还有中间的,尾部的,分成3个部分,看我讲来。
 afx_msg BOOL OnCreate(LPCREATESTRUCT lpCreateStruct);
 afx_msg void OnPaint();
 afx_msg void OnTimer(UINT nIDEvent );
 DECLARE_MESSAGE_MAP()
/****************************************************/
这个是第二部分啦,很重要的东西
/********************消息映射列表******************************/
这个东西也很眼熟,像WM_PAINT什么的是吧,这个就是上面我们需要重载的函数,也就是afx_msg开头的函数,
这个模块(我姑且现这么叫吧),有两个宏定义,分别是BEGIN_MESSAGE_MAP(CMainWindow,CWnd),END_MESSAGE_MAP();大家从名字上应该看的出来,一个是开头的,一个是结尾,BEGIN_MESSAGE_MAP()这个宏定义有两个参数,是什么呢,就是派生类与派生类的基类,CMainWindow是派生类,派生于窗口类,也就是CWnd类,说白了,这个消息列表的格式就是这个样的,我给大家一个演示
BEGIN_MESSAGE_MAP(CMainWindow,CWnd)
ON_WM_CREATE() 
ON_WM_TIMER()  
ON_WM_PAINT()   
END_MESSAGE_MAP()         
演示例子: BEGIN_MESSAGE_MAP(派生类,基类)
            在派生类中用afx_msg开头的函数;写法就是ON_WM_你的函名;看上面的例子吧  
            END_MESSAGE_MAP()


/***************************************************************/
现在该讲第三部分了,也是重头戏,就是代码段写法,也是最简单的一处,
还是上面的例子,加上该有的参数,写你的代码,在定义函数的时候,有返回值你就必须些返回值,没有就不用了。

BOOL CMainWindow::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 
 return TRUE;
}
....
void CMainWindow::OnTimer(UINT NIDEvent)
{
 
}

......
void CMainWindow::OnPaint()
{
 
}

总结一下吧:
第一步在类中写你要重载的函数,必须要以afx_msg开头,定义的时候要带参数。
在第二步的时候,要在两个宏之间写你的函数映射列表,写法是ON_WM_函数名,切记不带参数(在定义的时候有参数,在这也不写)。在BEGIN_MESSAGE_MAP()中写你的基类和派生类,看上面的例子代码。
第三步就简单了,写法是: 函数返回值类型   派生类::函数名(参数,参数...),后面就是代码了。三步就行了。这是手工添加的方法,旨在让读者知道怎么去写,大家如果还是不懂的话,
可以对照MFC框架(最好是对话框的,代码少),用ClassWizar添加一个类的成员函数,然后按照我的部走去看一遍,就没有问题了,在就是给个建议吧,看看孙鑫老师的VC++教程吧。
初学者的问题还有很多,以后再讲吧!
我讲的不好大家别怪,祝大家学习愉快吧!

posted on 2009-01-01 10:31 烟雨八戒 阅读(1107) 评论(1)  编辑 收藏 引用

评论:
# re: MFC学习笔记(2) 2009-01-03 23:35 | 沈臻豪(foxtail)
我也要学MFC 呵呵  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理