浅入MFC之对话框及MFC程序的运行

对话框的实现毕竟是很简单的。但是,自己亲手写段代码实现比什么都强,伙计,你说呢?特别对于新手来说,哦,好处太多了。同时,等你写完了,看看程序的运行,弹出自己的对话框,什么感觉,动手试一试吧,来吧。伙计!我说的没错。(注:本系列博文代码都在 visual studio 2008 中运行通过!)。

         首先建立一个基于对话框的 MFC 程序。创建过程就免了,因为那样却时很浪费时间来截每一张图,哦,太费劲了,为我想想吧!如果不会, call me

         我给我的程序起了个好听的名字, MFC_Dialog 听起来不错,哦,对了,伙计,不要忘了,选择基于对话框的应用程序,否则,你是做不出来的。呵呵!其它的就不要管了。要是你懂那就更好了。

         我会把代码和最终的运行结果贴出来,大家照着做就 ok 了!

         讲解一下,本程序使用到的一些系统函数:

1int MessageBox(      

    HWND hWnd ,

    LPCTSTR lpText ,

    LPCTSTR lpCaption ,

    UINT uType

);

2 int AfxMessageBox(

   LPCTSTR lpszText,

   UINT nType = MB_OK,

   UINT nIDHelp = 0

);

int AFXAPI AfxMessageBox(

   UINT nIDPrompt,

   UINT nType = MB_OK,

   UINT nIDHelp = (UINT) -1

);

可以看到 AfxMessageBox 有两种形式。

3 void AfxFormatString2(

   CString& rString,

   UINT nIDS,

   LPCTSTR lpsz1,

   LPCTSTR lpsz2

);

看到函数名了吗?是 AfxFormatString2 ,有了 2 ,那就可定有 1 ,那就顺便把 AfxFormatString1 页说了吧。

void AfxFormatString1(

   CString& rString,

   UINT nIDS,

   LPCTSTR lpsz1

);

 

现在把这几个函数在程序中如何使用,还有MFC程序是如何运行进行讲解一下。

要了解MFC程序,就算你读MFC程序,最起码的是,你要知道从哪里开始读,对吧?你读代码的顺序就是 MFC 的运行机顺序。很多人不知道这个顺序,那就肯定不能写出好的 MFC 程序,你应该和我共鸣的。伙计,你认为呢?

首先,这个是一个基于对话框的很简单程序,没有牵扯到 MFC 那么重要的 Document/View 机制。就是怕,开始的药要是太猛了,怕伤了你们。

我的程序名称是 MFC_Dialog ,不错,很是朗朗上口。你会在 MFC_Dialog.cpp 中发现这么个全局变量。

 

// 唯一的一个 CMFC_DialogApp 对象

CMFC_DialogApp theApp;

 

是这么定义的。哦,对了,程序就是从这里开始运行的。你知道定义了一个 CMFC_Dialog 类的对话框意味着什么吗?如果你记住了上一篇博文的MFC类的框架图你就应该知道了。 CMFC_Dialog 这个类的父类是谁?那肯定是 CWinApp 了。对吧。你看看你的代码,就知道我的对错了。如果在 visual studio 2008 下你会觉得我说的是错的,呵呵,应为你会发现它的父类是 CWinAppEx ,哦,是的,但是我没有错,你在看看 CWinAppEx 的父类是谁,你会发现是 CWinApp ,那么 CWinAppEx 哪里来的呢?看看 Ex ,你该知道是什么意思了吧!这说明 CWinAppEx CWinApp 类的扩展,就是说微软在原来的基础上加入了新的东西。现在该明白了吧。

 

现在接着说MFC程序的运行过程。开始了征程,这个全局变量,就开始了这些父类的构造函数了。这个是C++的性质,你该懂得。

 

这个执行过程,我不会讲的像《深入浅出MFC》那么详细,因为我也没有那么多时间。呵呵!接着来,经过很漫长的运行,终于到了 InitApplication 函数,在这里运行,这个函数时 CWinApp 中的虚函数,虚函数你该知道它意味着什么。但是它通常是不需要改写的。所以就是调用 CWinApp 的。接着就到了 InitInstance 函数,哦,这个也是 CWinApp 中的一个虚函数,但是在 CMFC_Dialog 类中改写了该函数,那么现在该调用哪个呢?你该知道的,伙计,如果你不知道,那就该挨骂了,当然是子类的了,因为是改写了它,这个函数我们是必须改写的,在你的程序中,你会看到的。

哦,再看看在 InitInstance 中发生了什么事情呢?

CMFC_DialogDlg dlg;

         m_pMainWnd = &dlg;

         INT_PTR nResponse = dlg.DoModal();

 

是的,就是这段代码!什么意思?一个子类的对象,然后将主窗口的指针指向这个对象,意思就是说这个对象现在就是主窗口了,是吧!没错,是的。接下来,就是获得对话框窗口的返回值赋值给 nResponse ,不错的想法,做的不错。

 

接下来,MFC自己又做了很多工作,你不知道的工作,如果想知道,那就去看看《深入浅出MFC》这本书。最后到了Run函数,这个函数时干嘛的?是执行消息循环的,什么是消息循环?不好意思?我不能讲,是将起来的话,那就太多了,大概就是,例如:一个按钮,你把这个按钮按下去了,然后,该干什么了?是的,你作为程序员你要知道的,按下去以后就是执行一段程序,一段处理当这个按钮按下去时该执行的程序,是什么程序,不好意思,我也不知道,这个程序该由自己去完成。就是说,按钮按下,产生一个消息,一个消息到达了对应的消息处理函数(就是你要去实现的函数),然后完成某个特定的功能。好了,累死我了,伙计,要是有杯咖啡多好!

 

哦,简单的理论讲完了,该到程序中来看看了。如果这么点理论看不懂,可能是我讲的不清楚,也有可能是你的IQ......。哦,你是聪明的,我不该这么说的。如果你去看《深入浅出MFC》,你会哭的,你会哭的像人抢走小孩的棒棒糖一样的哭,很伤心的。哦,我不想看到你们受伤,所以就是我的悲剧,来写博客。累......

 

最后,我把一个简单MFC程序的代码贴上,你们自己看吧。通过这个程序,首先,熟悉 visual studio 2008 的操作和消息对话框的建立和与消息对话框相关的API函数的使用。好了,就到这里,希望大家能学到一些东西。

posted @ 2011-04-16 19:57  Java EE  阅读(243)  评论(0编辑  收藏  举报