频道栏目
首页 > 资讯 > 其他 > 正文

MFC相关知识

16-10-17        来源:[db:作者]  
收藏   我要投稿

每个应用程序都作为一个工程来处理,它包含了头文件、源文件和资源文件等,这些文件通过工程集中管理。 在VS2010中,工程都是在解决方案管理之下的。一个解决方案可以管理多个工程,可以把解决方案理解为多个有关系或者没有关系的工程的集合。 VS2010提供了一个Solution Explorer 解决方案浏览器视图,可以显示当前解决方案的内容,当新建一个工程时可以选择新建一个解决方案还是加入当前解决方案。

生成应用程序框架:

MFC ActiveX Control 用来生成MFC ActiveX 控件程序; MFC Application 用来生成MFC 应用程序; Single document(单文档); Multiple documents(多文档); Dialog based(基于对话框); Multiple top-level documents; Use MFC in a shared DLL(动态链接库方式使用MFC):访问时,应用程序本身就会小些,但发布应用程序时必须同时添加必要的动态链接库,以便在没有安装VS2010 的机子上能够正常运行程序。 Use MFC in a static library(静态库方式使用MFC):访问时,MFC 的类会编译到可执行文件中,所以应用程序的可执行文件要比上种方式大,但可以单独发布,不需另加包含MFC 类的库。 生成类对话框:视图类(CHelloWorldView)、应用类(CHelloWorldApp)、文档类(CHello WorldDoc)和主框架窗口类(CMainFrame)。

文件的组成:

Debug 版本vs Release 版本:Debug 版本的可执行文件中包含了用于调试的信息和代码,而Release 版本则没有调试信,不能进行调试,但可执行文件比较小。 解决方案相关文件包括解决方案文件夹下的.sdf 文件、.sln 文件、.suo 文件和ipch 文件夹:.sdf 文件和ipch 目录一般占用空间比较大,几十兆甚至上百兆,与智能提示、错误提示、代码恢复和团队本地仓库等相关;;;.sln 文件和.suo 文件为MFC 自动生成的解决方案文件,它包含当前解决方案中的工程信息,存储解决方案的设置。 工程相关文件包括工程文件夹下的.vcxproj 、.vcxproj.filters 文件:.vcxproj 文件是MFC 生成的工程文件,它包含当前工程的设置和工程所包含的文件等信息。.vcxproj.filters 文件存放工程的虚拟目录信息,也就是在解决方案浏览器中的目录结构信息。 应用程序头文件.h和源文件.cpp:CWinAppEx类,CFrameWndEx 类,CDocument 类,CView 类,CDockablePane 类派生出CClassView 类,CDockablePane 类派生出CFileView 类,CDockablePane 类派生出COutputWnd 类,CDockablePane 类派生出CPropertiesWnd 类,CTreeCtrl 类派生出CViewTree 类。 资源文件:res 目录:工程文件夹下的res 目录中含有应用程序默认图标、工具栏使用图标等图标文件。HelloWorld.rc:包含默认菜单定义、字符串表和加速键表,指定了默认的About 对话框和应用程序默认图标文件等。Resource.h:含有各种资源的ID 定义。 预编译头文件:几乎所有的MFC 程序的文件都要包含afxwin.h 等文件,如果每次都编译一次则会大大减慢编译速度。所以把常用的MFC 头文件都放到了stdafx.h 文件中,然后由stdafx.cpp 包含stdafx.h 文件,编译器对stdafx.cpp 只编译一次,并生成编译之后的预编译头HelloWorld.pch,大大提高了编译效率。 编译链接生成文件:文件夹中主要包含有应用程序的可执行文件。

MFC 消息映射机制:

消息一般由三个部分组成:(1)一个无符号整数,是消息值;(2)消息附带的WPARAM 类型的参数;(3)消息附带的LPARAM 类型的参数。其实我们一般所说的消息是狭义上的消息值,也就是一个无符号整数,经常被定义为宏。 MFC 使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射表,以及消息处理函数的声明和实现等代码。当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处理函数,然后由消息处理函数进行相应的处理。 消息映射表:
1. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
2. ON_WM_CREATE();
3. ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize);
4. ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::On ToolbarCreateNew);
5. ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_ WINDOWS_7, &CMainFrame::OnApplicationLook);
6.ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIE W_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook);
7. ON_WM_SETTINGCHANGE();
8. END_MESSAGE_MAP();

在BEGIN_MESSAG_MAP 和END_MESSAGE_MAP 之间的内容成为消息映射入口项。消息映射除了在CMainFrame 的实现文件中添加消息映射表外,在类的定义文件MainFrm.h 中还会添加一个宏调用:

DECLARE_MESSAGE_MAP();//一般这个宏调用写在类定义的结尾处。

添加消息处理函数:

1、在类定义中加入消息处理函数的函数声明,注意要以afx_msg 打头。例如MainFrm.h 中WM_CREATE 的消息处理函数的函数声明:
afx_msg int OnCreate(LPCREATESTRUCT                                              lpCreateStruct);。
2、在类的消息映射表中添加该消息的消息映射入口项。例如WM_CREATE 的消息映射入口项:ON_WM_CREATE()。 3、在类实现中添加消息处理函数的函数实现。MainFrm.cpp 中WM_CREATE 的消息处理函数的实现: -
int CMainFrame::OnCreate(LPCREATESTRUCT         lpCreateStruct)
{
       ......
}

用户自定义消息:

1、定义消息宏,如:#define WM_UPDATE_WN D
(WM_USER+1); 2、在消息映射表中添加消息映射入口项:ON_MESSAGE(WM_UPDATE_WND, &CMainFrame::OnUpdateWnd); 3、然后在MainFrm.h中添加消息处理函数的函数声明:afx_msg LRESULT OnUpdateWnd(WPARAM wParam, LPARAM lParam); 4、最后在MainFrm.cpp 中实现此函数。

创建对话框:

第一,创建对话框资源,主要包括创建新的对话框模板、设置对话框属性和为对话框添加各种控件; 第二,生成对话框类,主要包括新建对话框类、添加控件变量和控件的消息处理函数等。
类视图
资源视图

修改对话框属性:

ID:对话框ID,唯一标识对话框资源,可以修改; Caption:对话框标题; Border:边框类型,四种:None、Thin、Resizing 、Dialog Frame; Maximize:是否使用最大化按钮; Minimize:是否使用最小化按钮; Style:对话框类型。三种:Overlapped(重叠窗口)、Popup(弹出式窗口)、Child(子窗口)。弹出式比较常见; System Menu:是否带有标题栏左上角的系统菜单,包括移动、关闭等菜单项; Title Bar:是否带有标题栏; Font(Size):字体类型和字体大小。如果将其修改为非系统字体,则Use System 自动改为False。而如果Use System 原来为False,将其修改为True,则Font(Size)自动设置为系统字体。
对话框属性
添加控件,修改Caption,ID;
对话框是CXXDlg是从CDialogEx类派生的;一般对话框类都是继承自CDialogEx 类。
基类
注意,一般类名都以C 打头,又比如,CTestDlg。

为对话框中的控件添加变量:

静态文本框只是为了说明后面紧跟的编辑框中数据的意义,是被加数、加数还是和,是不会变的,不需要添加变量; 按钮控件是用来操作的,这里也不为它们添加变量; 编辑框中的数据可能会经常变化,有必要为它们每个控件关联一个变量; 在编辑框上点右键,在右键菜单中选择“Add Variable”。弹出添加成员变量的向导对话框。 为其添加值变量而不是控件变量; “Variable type”下的组合框此时默认选中的是“CString”,选择数据类型; 在“Variable name”中写入自定义的变量名;
编辑框关联变量

对话框类的数据交换和检验:

在程序运行界面中,用户往往会改变控件的属性,例如,在编辑框中输入字符串,或者改变组合框的选中项,又或者改变复选框的选中状态等。控件的属性改变后MFC 会相应 修改控件关联变量的值。这种同步的改变是通过MFC为对话框类自动生成的成员函数Do DataExchange()来实现的,这也叫做对话框的数据交换和检验机制。 三个编辑框添加了变量以后,在TEST1Dlg.cpp 中CTEST1Dlg 的DoDataExchange()函数的函数体中多了三条DDX_Text 调用语句。
void CTEST1Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);// 处理MFC 默认的数据交换
    DDX_Text(pDX, IDC_ADD1_EDIT, m_Sum);// 处理控件IDC_ADD1_EDIT 和变量m_Sum 之间的数据交换
    DDX_Text(pDX, IDC_ADD2_EDIT, m_Add2);
    DDX_Text(pDX, IDC_SUM_EDIT, m_Sum1);
}
在程序运行界面中输入被加数,则通过DoDataExchange()函数可以将输入的值保存到 变量中,反之如果程序运行中修改了变量 的值,则通过DoDataExchange()函数也可以将新的变量值显示到被加数的编辑框中。 DoDataExchange()并不是被自动调用的,而是需要我们在程序中调用CDialogEx::UpdateData()函数,由UpdateData()函数自动调用DoDataExchange()的。 CDialogEx::UpdateData()函数的原型为: -
BOOL UpdateData(BOOL bSaveAndValidate = TRUE);
参数:bSaveAndValidate 用于指示数据传输的方向,
     TRUE 表示从控件传给变量,
     FALSE 表示从变量传给数据。
     默认值是TRUE,即从控件传给变量。
返回值:CDialogEx::UpdateData()函数的返回值表示操作是否成功,成功则返回TRUE,否则返回FALSE。

为控件添加消息处理函数:

使用Class Wizard 添加消息处理函数:

类向导对话框

通过“Add Event Handler…”添加消息处理函数;

事件处理向导

在按钮的属性视图中添加消息处理函数;
属性视图

双击按钮添加消息处理函数;

void CTEST1Dlg::OnBnClickedSumButton()
{
    // TODO: 在此添加控件通知处理程序代码
}

在消息处理函数中添加自定义功能

void CTEST1Dlg::OnBnClickedSumButton()
{
    // TODO: 在此添加控件通知处理程序代码
    // 将各控件中的数据保存到相应的变量
   UpdateData(TRUE);
   // 将被加数和加数的加和赋值给m_editSum
   m_Sum1=m_Add2+m_Sum;
   UpdateData(FALSE);//变量到控件
}

运行过程:

输入被加数和加数,点“计算”按钮后产生点击消息,从而 调用OnBnClickedAddButton()函数。 进入此函数后,首先由UpdateData(TRUE)函数将被加数的值5.1和加数的值2.3 分别保存到变量m_Sum和m_Add,然后通 过语句m_Sum1= m_Sum+m_Add;计算出被加数和加数的和为7.4, 并把7.4 赋值给m_Sum1。
运行结果

对话框控件的Tab 顺序问题:运行加法计算器程序,显示对话框后不进行任何操作,直接按回车,可以看到对话框退出了;
解决方法:在主菜单中选择“Format”->”Tab Order”,或者按快捷键Ctrl+D,对话框模板上就会显示各个控件的Tab 顺序数字;
Tab数组顺序
从自己认为Tab 顺序应该为1 的控件开始依次单击,随着单击的完成,各控件的Tab 响应顺序也按我们的想法设置好了。
Tab数字顺序

相关TAG标签
上一篇:Java多线程实现的聊天客户端和服务器
下一篇:ThinkPHP框架Model分析研究
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站