对话框的实现毕竟是很简单的。但是,自己亲手写段代码实现比什么都强,伙计,你说呢?特别对于新手来说,哦,好处太多了。同时,等你写完了,看看程序的运行,弹出自己的对话框,什么感觉,动手试一试吧,来吧。伙计!我说的没错。(注:本系列博文代码都在 visual studio 2008 中运行通过!)。
首先建立一个基于对话框的 MFC 程序。创建过程就免了,因为那样却时很浪费时间来截每一张图,哦,太费劲了,为我想想吧!如果不会, call me !
我给我的程序起了个好听的名字, MFC_Dialog 听起来不错,哦,对了,伙计,不要忘了,选择基于对话框的应用程序,否则,你是做不出来的。呵呵!其它的就不要管了。要是你懂那就更好了。
我会把代码和最终的运行结果贴出来,大家照着做就 ok 了!
讲解一下,本程序使用到的一些系统函数:
1:int 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函数的使用。好了,就到这里,希望大家能学到一些东西。