[MFC]动态控件实现 程序执行流程 [大三TJB_708]

MFC程序框架

MFC程序包含内容大致有:应用程序类,框架窗口类,消息映射宏和消息处理函数,以及一个应用程序对象。


应用程序类从CWinApp类派生,是MFC程序的主体类,用于建立主函数WinMain(),控制程序的执行流程。框架窗口类从CFrameWnd类派生,该类将窗口函数封装在其中。消息映射宏用于将消息和消息处理函数与对应的窗口函数关联起来。应用程序对象是程序程序执行的入口点,每个MFC程序都必须有一个应用程序对象,程序执行从应用程序对象被建立时开始。


建立MFC程序项目

此例是一个基于对话框的MFC程序,建立工程过程如下:

1.      打开Visual Studio 2010—>文件-->新建-->项目

2.      由1得出以下界面,选择”Visual C++”, 再选择”MFC”,中间栏选择”MFC应用程序 Visual C++”。在名称(N)栏输入工程名称,如130117Pro。选择此工程所在的文件目录,如D:\VisualStdioWorkdplace

点击确定按钮。

[MFC]动态控件实现 程序执行流程 [大三TJB_708]_第1张图片
在以后出现的界面中一直点击下一步,直到出现以下界面:
[MFC]动态控件实现 程序执行流程 [大三TJB_708]_第2张图片

3. 把以上界面设置为基于对话框,其余选项默认,点击完成得到以下界面

到这一步一个基于对话框的工程项目就建立好了。
 

设置按钮

1. 设置静态按钮来触发动态按钮

a.在上图左边的“工具箱下的对话编辑框中”拉一个Button到对话框中:

b.选中Button1,右键后选中属性,在弹出来的属性框中修改外观下Caption后的值为“Add”,修改杂项下的ID为“IDC_ADD”(可以取便于记忆的名字和ID)
[MFC]动态控件实现 程序执行流程 [大三TJB_708]_第3张图片

关闭属性

c.选中修改ID和标题(caption)的按钮,右键后选中类向导(静态按钮的事件响应可以通过类向导来完成)

为IDC_ADD(a中按钮的标识符)添加响应函数。早对象中选中IDC_ADD,在消息栏选中按钮对应的消息,如BN_CLICKED(当用鼠标点击这个按钮时对应BN_CLICKED),双击BN_CLICKED后点击确定。

此时在对话框的实现文件(20130117ProDlg.cpp)中就自动生成了此函数:
[MFC]动态控件实现 程序执行流程 [大三TJB_708]_第4张图片
图@

同时,类向导在20130117ProDlg.cpp文件中的消息映射中添加了当鼠标点击此按钮事件发生时调用生成函数的映射宏:

[MFC]动态控件实现 程序执行流程 [大三TJB_708]_第5张图片

2.设置动态按钮

动态按钮不能通过拖动一个按钮的方式的到对话框,也不能通过类向导来生成代码。一切操作需要手动完成。

a.在解决方案资源管理器(这个方框


在点击后出现)打开资源文件,然后双击后缀名为.rc选项,在弹出来的菜单中双击String Table 里面的内容。

b.在弹出的String Table里面添加动态按钮,包括ID标识符,宏值,按钮名称


[MFC]动态控件实现 程序执行流程 [大三TJB_708]_第6张图片
动态按钮的幕后操作(属性)就这样子完成了。

 

3.设置静态按钮的响应事件

我们需要完成的功能是当点击Add按钮时,一个新的按钮(设置的IDC—_MYBUT按钮)就出现。

现在我们回到图@,把CMy20130117ProDlg::OnBnClickedAdd()函数编码如下

 

void CMy130117ProDlg::OnBnClickedAdd()
{
	// TODO: 在此添加控件通知处理程序代码
	//var1变量直接到头文件里面添加,添加到派生类里面
	if(var1){
		CString m_Caption;
		m_Caption.LoadString(IDC_MYBUT); 
		CButton *p_MyBut = new CButton();
		ASSERT_VALID(p_MyBut);
		p_MyBut->Create( m_Caption, WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | 0, CRect(10,10,100,50), this, IDC_MYBUT );
	}
}

4.设置动态按钮响应事件

动态按钮的响应事件需要手动添加。

a.  仿类向导声明函数的方式声明自定义函数,红线之上的函数为自定义函数。

CMy20130117ProDlg.h文件

// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	afx_msg void OnMyBut();
	DECLARE_MESSAGE_MAP()

afx_msg void OnMyBut()为自定义函数。

b.添加消息映射宏,红线之上为添加的映射宏

CMy20130117ProDlg.cpp文件

BEGIN_MESSAGE_MAP(CMy130117ProDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_ADD, &CMy130117ProDlg::OnBnClickedAdd)
	ON_BN_CLICKED(IDC_MYBUT, &CMy130117ProDlg::OnMyBut)
END_MESSAGE_MAP()

ON_BN_CLICKED(IDC_MYBUT, &CMy130117ProDlg::OnMyBut)为手动添加的消息宏。

a.编写自定义函数

CMy20130117ProDlg.cpp文件

void CMy130117ProDlg::OnMyBut()
{
	CString Str;
	Str	= "哈!你单击了动态按钮!";
	MessageBox(Str);
}
说明:为了纪念我参考的博客,这里也引用他们的"哈!你单击了动态按钮",下次先记下网址。到了这里,目标完成。


执行结果

调试运行程序界面如下:

[MFC]动态控件实现 程序执行流程 [大三TJB_708]_第7张图片

界面原本按钮为“确定”、“取消”、“Add”按钮。当点击Add按钮时,“按钮”按钮出现。当点击“按钮”按钮时,对话框出现。半动态控件。


MFC程序执行分析

每个派生类可以拥有一个头文件和一个实现文件(*.cpp源程序文件),头文件中主要用来定义派生类。

 

1.实现动态按钮的对话框类

头文件(一个派生于CDialogEX类的头文件)

[MFC]动态控件实现 程序执行流程 [大三TJB_708]_第8张图片

类包含数据结构和方法(函数)。

1 表示CMy130117ProDlg是从CDialogEx类派生的,从而CMy130117ProDlg具有CDialogEx类的所有数据成员和函数,并且还可以继续在CMy130117ProDl类中添加程序设计中需要的数据成员(变量)和成员函数(自定义函数)。

2 表示可以在此派生类中添加数据成员。

3 表示在此类中声明的成员函数(可以是原类中就有的函数或者自定义的函函数)

4 DECLARE_MESSAGE_MAP()语句表明此类要对属于此类的消息进行反应(进行事件处理)。

实现文件即源文件(一个派生于CDialogEX类的源文件)
[MFC]动态控件实现 程序执行流程 [大三TJB_708]_第9张图片

类实现文件(源程序文件)主要包括消息映射宏和函数。

1 BEGIN_MESSAGE_MAT(CMy130117ProDlg, CDdialogEx)…END_MESSAGE_MAP之间的内容表示消息映射宏。

BEGIN_MESSAGE_MAT里面的第二个参数表示父类,第一个参数表示第二个参数的派生类。二者之间的消息映射宏由图1中DECLARE_MESSAGE_MAP()声明此类(由CDialogEX派生的130117ProDlg类)将要处理消息映射宏中列举的各种信息。如ON_BN_CLICKED(IDC_ADD,&CMy130117ProDlg::OnBnClickedAdd)表示此类将要处理ON_BN_CLICKED消息(鼠标点击)。参数IDC_ADD和&CMy130117ProDlg::OnBnClickedAdd表示在IDC_ADD控件上面实施ON_BN_CLICKED类消息时程序将调用CMy130117ProDlg::OnBnClickedAdd函数,执行CMy130117ProDlg::OnBnClickedAdd内的代码。

2 实现文件(源文件130117ProDlg.cpp)中的函数编写区域。此函数首先要在图1中被声明(见图1,不管是父类的成员函数还是自定义函数都需要声明)。在130117ProDlg.cpp文件中编写此函数的格式为

函数类型  类名::成员函数名(参数列表)

{

         ……

}


总结函数被调用的流程是这样的:

2.主程序应用类

主程序应用类派生于CwinApp类。

头文件(130117Pro.h)

[MFC]动态控件实现 程序执行流程 [大三TJB_708]_第10张图片

头文件的主要作用是从CWinApp派生一个CMy130117ProApp类,包含一个构造函数CMy130117ProApp(),声明一个成员函数InitInstance(),声明将要处理各种消息,声明主程序应用类的对象theApp.

 

实现文件(130117Pro.cpp)

[MFC]动态控件实现 程序执行流程 [大三TJB_708]_第11张图片

35行表示定义一个属于应用程序类的对象。程序从此处开始执行,每个MFC只能有一个应用程序类的对象。当定义应用程序对象时,将引发函数_tWinMain()(实质上是WinMain())的调用。_ tWinMain()K将引发AfxWinMain()的执行,该函数将初始化MFC应用程序。在执行完内外部的初始化程序后,将进入应用程序类对象的消息循环(nReturnCode->pThread->Run()),进入消息循环后程序将检测有哪些消息(事件)发生,当此事件在消息映射宏中时就会调用相应的函数来执行,从而windows界面出现不同的效果。

 

MFC Note Over。

你可能感兴趣的:([MFC]动态控件实现 程序执行流程 [大三TJB_708])