当前位置:硬件测评 > vs2010 wizard_在VS 2010中如何使用Class Wizard添加消息处理函数

vs2010 wizard_在VS 2010中如何使用Class Wizard添加消息处理函数

  • 发布:2023-09-19 22:22

教科书和网上讲MFC大多是基于VC++6.0,这里讲一下VS2010的MFC的消息函数的添加。

VS 2010的MFC的类向导如下(通过项目-->类向导打开):

一、消息响应函数的添加(以单文档应用程序的菜单项点击事件为例):

1.确定响应函数属于哪个类,这里属于CAppView类。

2.找到对象ID,这里是我们添加的菜单项的ID。

3.选择何种响应消息,这里菜单项的响应消息应为WM_COMMAND消息。UPDATE_COMMAND_UI是界面需要重绘时由系统发送。

4.添加消息处理函数,点击“添加处理程序”即可。

5.编辑处理代码。

注:

若要删除添加的消息处理函数,直接在类向导中找到它并点击删除即可,这样相应的代码就被注释了。类向导添加消息处理函数其实做了三件事:

1.在处理消息的类.h文件中声明消息处理函数,如:

? afx_msg void On_Point();

2.在该类的CPP文件中编辑实现代码;

3.建立映射。

? ? ? 即 建立消息和消息函数的对应关系,在类的.h文件中,有DECLARE_MESSAGE_MAP()的宏,它声明这个类含有消息映射。然后在类的.CPP文件中有

BEGIN_MESSAGE_MAP()

ON_COMMAND(ID_FILE_PRINT,&CView::OnFilePrint)

ON_MESSAGE(WM_MY_MESSAGE,&CMyAppView::OnMyMessage)

.................

END_MESSAGE_MAP()

在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间就进行了消息和消息处理函数的对应关系的建立,根据消息的类型,左边是消息的ID或者控件的ID,右边均为处理函数。ON_COMMAND(命令消息),ON_MESSAGE(可用于自定义消息)表示不同的消息类型。

所以,我们也可以通过手工加入东西来进行消息函数的添加,这跟用类向导添加是一样的。

若是自定义消息则之前还需要有以下步骤:

1.定义消息,如:

#define ? ? WM_MYMESSAGE ? ? ?(WM_USER+101)

这里WM_USER也是一个宏,其实就是一个数字而已,这样的定义方法是为了防止消息值重复。

2.何时发送消息,如果是系统定义好了的消息,它会在合适的时候发送消息给处理函数,而用户自定义的消息则需要自己定义何时发送。

发送消息有两个函数:

sendmessage() ? postmessage()

前者将消息发送给窗口处理函数,直到发送的消息被处理后才返回。后者直接将消息发送到消息处理队列就返回。

用法:

sendmessage(WM_MYMESSAGE);

VS2010中的Profile(性能剖析)功能十分实用,它可以协助程序员迅速锁定当前程序的性能瓶颈,为程序的优化做准备。

点击VS2010的Analyze菜单,选择Launch Performance Wizard,依照提示可以很方便地完成Profile的必需配置。可能你会碰到"Injection of runtime library failed"错误,这时就不要使用Wizard,而要选择Analyze下拉菜单中的Profiler->Attach/Detach...,将Profiler附加到进程上。

本文以名为Sorting的小程序为例。程序中除了main函数之外,定义了全局函数SortData和PrintData分别实现排序和打印功能。核心代码如下所示:

//!?SortAndPrint?definition??/*!?????\param?iNum?待排序数组大小?????\param?data?待排序数组首指针?????\return?函数执行成功则返回1??????????-?三种方式排序?????????-#?冒泡排序?????????-#?数组+STL?sort?*/??bool?SortData(int?&iNum,int*?data)??{??????int?temp;??????//!?冒泡排序??????for(int?i=1;idata[j+1])??????????????{??????????????????temp=data[j];??????????????????data[j]=data[j+1];??????????????????data[j+1]=temp;??????????????}??????????}??????}??????return?1;??}????//!?PrintData?definition??/*!??????打印有序数列到屏幕??????\param?iNum?待排序数组大小?????\param?data?待排序数组首指针?????\return?函数执行成功则返回1?*/??bool?PrintData(int?&iNum,int*?data)??{????????????//!?输出有序数列??????for(int?i=0;i

测试用例为50000个随机整数,采用冒泡排序,程序对应的Sample Profiling Report如图1所示。

图1 采用冒泡排序,程序对应的哦Sample Profiling Report

修改SortData的代码为:

bool?SortData(int&iNum,int*?data)??{??????sort(data,data+iNum-1);??????return?1;??}??

这里调用了STL中的sort函数模板,程序对应的Sample Profiling Report如图2所示。

图2 调用STL sort函数模板,程序对应的Sample Profiling Report

观察图1和图2中的CPU Usage曲线,一定程度上图2更优一些;观察Hot Path(即调用热路径),已经从图1中的SortData转移到图2中的Unknown Function;另外,函数独占工作时间也发生了变化,图2显示耗费最大的已经不再是SortData函数了。

VS2010同样提供了对比工具,将图1和图2各自的Sample Profiling Report进行Compare,如图3所示。

非常明显,核心的函数调用,调用了STL sort模板函数的新程序对资源的消耗要小很多。

上面的例子说明,借助于VS2010 Profiler,可以迅速锁定当前程序的性能瓶颈,如本例中的SortData函数,为程序的优化做准备;程序优化之后,Profiler也是一个必要的验证工具,只有比较优化前后程序Profiling Report才能确定程序是否真的得到了优化。

转载于:https://www.sychzs.cn/For-her/p/3817636.html

原文:http://www.sychzs.cn/software/141.html

解决方案与工程

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

?????? 下图左侧面板中正在显示的视图就是Solution Explorer,视图中有一个解决方案-HelloWorld,此解决方案下有一个同名的工程-HelloWorld。

??????在应用程序向导生成应用程序后,VS2010会在用户设置的路径下,以解决方案名为名称建立一个目录,里面存放自动生成的文件。

??????使用VS2010应用程序向导生成单文档应用程序框架

??????鸡啄米这里简略演示下怎样生成单文档应用程序框架,让大家先有个直观的了解,有不理解的地方可以留着以后回来再看。下面按照操作步骤一步步讲解:

????? 1.点菜单栏File->New->Project,弹出New Project对话框,我们可以选择工程类型。

??????如果安装完VS2010以后第一启动时已经设置为VC++,则Installed Templates->Visual C++项会默认展开,而如果没有设置VC++,则可以展开到Installed Templates->Other Languages->Visual C++项。因为我们要生成的是MFC程序,所以在“Visual C++”下选择“MFC”,对话框中间区域会出现三个选项:MFC ActiveX Control、MFC Application和MFC DLL。MFC ActiveX Control用来生成MFC ActiveX控件程序。MFC Application用来生成MFC应用程序。MFC DLL用来生成MFC动态链接库程序。当然我们要选择MFC Application。

????? 在对话框下部有Name、Location和Solution name三个设置项。意义如下:Name--工程名,Location--解决方案路径,Solution name--解决方案名称。这里Name我们设为“HelloWorld”,Location设置为“桌面”的路径,Solution name默认和Name一样,当然可以修改为其他名字,这里我们不作修改,也使用“HelloWorld”。点“OK”按钮。

????? 2.这时会弹出“MFC Application Wizard”对话框,上部写有“Welcome to the MFC Application Wizard”,下面显示了当前工程的默认设置。第一条“Tabbed multiple document interface (MDI)”是说此工程是多文档应用程序。如果这时直接点下面的“Finish”按钮,可生成具有上面列出设置的多文档程序。但我们此例是要建立单文档应用程序,所以点“Next”按钮再继续设置吧。

????? 3.接下来弹出的对话框上部写有“Application Type”,当然是让选择应用程序类型,我们看到有四种类型:Single document(单文档)、Multiple documents(多文档)、Dialog based(基于对话框)和Multiple top-level documents。我们选择Single document类型,以生成一个单文档应用程序框架。单文档应用程序运行时是一个单窗口界面。

?

??????此对话框的“Resource language”还提供语言的选择,这里默认选择英语。“Project style”可选择工程风格,我们选择默认的“Visual Studio”风格。“Use of MFC”有两个选项:Use MFC in a shared DLL(动态链接库方式使用MFC)和Use MFC in a static library(静态库方式使用MFC)。选择Use MFC in a shared DLL时MFC的类会以动态链接库的方式访问,所以我们的应用程序本身就会小些,但是发布应用程序时必须同时添加必要的动态链接库,以便在没有安装VS2010的机子上能够正常运行程序。选择Use MFC in a static library时MFC的类会编译到可执行文件中,所以应用程序的可执行文件要比上种方式大,但可以单独发布,不需另加包含MFC类的库。这里我们使用默认的Use MFC in a shared DLL。点“Next”按钮。

????? 4.此时弹出上部写有“Compound Document Support”的对话框,可以通过它向应用程序加入OLE支持,指定OLE选项的复合文档类型。本例不需要OLE特性,使用默认值“None”。点“Next”按钮。

????? 5.弹出的新对话框上部写有“Document Template Properties”。“File extension”可以设置程序能处理的文件的扩展名。对话框其他选项还可以更改程序窗口的标题。我们都使用默认设置,点“Next”按钮。

????? 6.此时弹出的对话框主题是“Database Support”。用于设置数据库选项。此向导可以生成数据库应用程序需要的代码。它有四个选项:

????? None:忽略所有的数据库支持;

????? Header files only:只包含定义了数据库类的头文件,但不生成对应特定表的数据库类或视图类;

????? Database view without file support:创建对应指定表的一个数据库类和一个视图类,不附加标准文件支持;

???? ?Database view with file support:创建对应指定表的一个数据库类和一个视图类,并附加标准文件支持。

????? 本例选择默认值“None”,不使用数据库特性。点“Next”按钮。

????? 7.这时弹出的对话框是关于“User Interface Features”,即用户界面特性。我们可以设置有无最大化按钮、最小化按钮、系统菜单和初始状态栏等。还可以选择使用菜单栏和工具栏生成简单的应用程序还是使用ribbon。这里我们都选择默认设置。点“Next”进入下一步。

??????8.此时弹出“高级特性”对话框。可以设置的高级特性包括有无打印和打印预览等。在“Number of files on recent file list”项可以设置在程序界面的文件菜单下面最近打开文件的个数。我们仍使用默认值。点“Next”按钮。

??????9.弹出“生成类”对话框。在对话框上部的“生成类”列表框内,列出了将要生成的4 个类:一个视图类(CHelloWorldView)、一个应用类(CHelloWorldApp)、一个文档类(CHelloWorldDoc)和一个主框架窗口类(CMainFrame)。在对话框下面的几个编辑框中,可以修改默认的类名、类的头文件名和源文件名。对于视图类,还可以修改其基类名称,默认的基类是CView,还有其他几个基类可以选择。这里我们还是使用默认设置。点“Finish”按钮。

???? ?应用程序向导最后为我们生成了应用程序框架,并在Solution Explorer中自动打开了解决方案(见上面第一张图)。

??????编译运行生成的程序

??????点菜单中的Build->Build HelloWorld编译程序,然后点Debug->Start Without Debugging(快捷键Ctrl+F5)运行程序,也可以直接点Debug->Start Without Debugging,这时会弹出对话框提示是否编译,选择“Yes”,VS2010将自动编译链接运行HelloWorld程序。结果页面如下所示:

相关文章