《VC MFC 编程实例19.pdf》由会员分享,可在线阅读,更多相关《VC MFC 编程实例19.pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 本文由s d h e x u 贡献 p d f 1。下载 下载 附录D 开发中注意事项 还剩下一些问题没有讨论,下面这些问题虽然与 VC+或MFC类库无关,但在应用创建一 个应用程序时,也是同样重要的.设置De v e l o p e r St u d i o De v e l o p e r St u d i o 可以轻松地设置为符合个人开发应用程序的标 准.这里我们将讨论其中的一些选项.调试 有一些资源可以用来调试应用程序,除了在运行应用程序的调试版时明显可用的交 互调试器外,还可以调用框架,DEVELOPER STUDIO,甚至 M F C类函数以及第三方运行调 试器.组织和建立工程
2、如果应用程序只是一个执行文件,而没有附加的 DLL文件时,则你可能 停留在工程的工作空间范围内.然而,如果应用程序涉及多个库和多个执行文件时,则需要 考虑建立和维护工程的策略问题.Mi c r o s o f t 命名习惯 这里讨论Mi c r os o f t 坚持的某些非正式的和完全自愿的变量命名习惯.Sp y i n g SPY.EXE是潜在的工具,它不仅可调试自身的应用程序,而且也作为一种监 视其他应用程序的方法,以推算出他人是怎样执行他们的界面的.其他例子资源 除了本书例子以外,我们还介绍可以参考的其他例子资源,这些资源可能 有一个或多个打算在应用程序中用 MFC VC+执行的例子.
3、D.1 设置De v e l o p e r St u d i o D.1.1 激活其他应用程序 De v e l o p e r St u d i o 可在To o l s 菜单中添加定制菜单命令,在环境内运行其他应用程序,方法 如下:1)单击To o l s/Cu s t o m i z e 菜单命令,以打开 Cu s t o m i z e 属性表.2)选择To o l s 选项卡,并滚动到菜单列表的底部(De v e l o p e r St u d i o 应该已经在该菜单中预 装了几个命令).3)选中底部的空白焦点矩形,并输入需要在菜单中显示的名字;按回车键将打开三个编 辑框,分别
4、是Co m m a n d,Ar g u m e n t s 和In i t i a l Di r e c t o r y.4)在Co m m a n d 中,输入要运行的执行文件的路径名.5)在Ar g u me n t s 中,输入传递给执行文件的参数.6)在In i t i a l Di r e c t o r y 中,输入运行该命令前 De v e l o p e r St u d i o 应该改变的目录.可把下面的命令添加到 To o l s 菜单:Ex p l o r e r 命令 使Wi n d o w s Ex p l o r e r s 最初在工程目录中打开.菜单名字输入到
5、Ex p l o r e r 中.命令输入 C:Wi n d o w s e x p l o r e r.e x e 或C:Wi n n t e x p l o r e r.e x e (根据操作系统而定),参数输入/e,并使初始目录(In i t i a l Di re c t o r y)为空白.DOS命令 打开一个初始在工程目录下 MS-DOS窗口.菜单命令输入 MS-DOS,命令输入 下载 始目录中输入$(当前目录).Ed i t o r 命令 附录D 开发中注意事项 331 C:Wi n n t Sy s t e m 32c m d.e x e 或C:Wi n d o w s c o
6、 m m a n d.e x e(根据操作系统而定),没有参数,在初 打开一个第三方文本编辑器,并传递当前选中的文件名到该编辑器;虽然环 境提供的文本编辑器是相当有效的,但市场上还有一些更加好用的编辑器.在菜单命令中输 入Ed i t o r,在命令中输入编辑器的路径,在参数中输入$(Fi l e Na m e)$(Fil e Ex t),在初始目录中 输入$(Wk s p Di r).当执行任何一个这样的菜单命令时,De v e l op e r St u d i o 保存所有的文件,以 便即使在调用该外部编辑器前修改了一个文件,打开该文件时,还是可以编辑它的最新版本.D.1.2 工具栏按钮
7、 De v e l o p e r St u d i o 允许配置工具栏中的按钮.1)单击To o l s/Cu s t o m i z e 菜单命令打开Cu s t o m i z e 属性表,并选择 Co m m a n d s 选项卡.2)可以把按钮组框中所示的按钮拖到一个已有的工具栏中,或者拖到一个空白空间以创 建一个新的工具栏.3)Ca t e g o r y 组合框改变可选的按钮选项.4)要删除一个按钮,把它拖回到 Pr o p e r t y Sh e e t 中.单击C o m m a n d 选项页上的每个图标将显示它所代表的命令的说明.通过查看菜单本身,用户可以发现哪个预定
8、义的图标与哪个预定义的菜单命令对应;显示在菜单命令边上的图标 是它们的工具栏按钮.工具栏按钮可能代表的命令如下:添加到 To o l s 菜单的任何命令,通常以p a g e 1 7开始.因此,在该页的 To o l s 目录中找到一个按 钮图标,它具有一个小铁锤和一个 7在第一个命令的右下角.C l a s s Wi z a r d,该命令可以在 Vi e w 目录下找到,一个具有巫士魔术棒的三角形.Op e n Wo r k s p a c e 命令是一个最常使用的命令,但没有默认的工具栏按钮;可以通过 选择Al l Co m m a n d s 目录为该命令创建一个按钮;在 Al l C
9、o m m a n d s 目录中,可以看到所 有De v e l o p e r St u d i o 命令的一个详细列表;滚动目录直到接近底部找到 Wo r k s p ac e 为止;拖动该选项到工具栏上的一个位置.因为该命令没有一个默认的工具栏图标与之关联,St u d i o 会提示一个可以分配给该按钮的常规图标的列表;还可以选择在按钮中包括菜单 命令的名字.注意 按自己的意愿定制St u d i o 后,应立即退出,因为对工具栏和菜单所做的改变直到 退出St u d i o 时才能保存,如果St u d i o 在正常退出前崩溃,则所有改变将无效;此外,还 要注意一次运行多个 S
10、t u d i o 实例的情况,确保最后一个退出的 S t u d i o 是需要改变的 St u d i o.因为,最后退出的St u d i o 决定最终改变St u d io 配置.D.2 调试 大多数调试工作可以通过 St u d i o 的Te x t Ed i t o r 界面完成,参见 MFC文档可获得更详细的内 容.然而,还有其他一些资源可以用来调试代码,下面介绍一些.D.2.1 TRACE()如果应用程序是时间或序列敏感的,可能需要打印出调试消息,而不用交互式调试器单 332 第五部分 附 录 下载 步执行通过一个关键部位;过去,程序员用 p r i n t f ()语句把调
11、试消息打印到打印机或磁盘文件 上;现在应用程序框架提供了一个与 p r i n t f ()命令相当的 TRACE()函数,但是 TRACE()直接 打印到St u d i o 的De b u g 窗口.它要求打印字符不超过 512个,一个例子如下:注意 在语句结束时一定要用换行符(n)!TRACE(In t e g e r=%d,St r i n g=%s n,i,s z);Af x Tr a c e En a b l e d=FALSE;/t u r ns o f f a l l TRACE()s t a t e m e n t s 注意 TRACE()语句在应用程序发行版中有问题时,如果
12、问题只出现在发行版中,则 必须改用p r i n t f (),还可以用下面即将讨论的Af x Me s s a g e Bo x ().D.2.2 Af xMe s s a g e Bo x ()如果问题只出现在没有安装 De v e l o p e r St u d i o 的操作系统上的应用程序中,或只出现在应 用程序的发行版中时,除了在软件中用 p r i n t f ()外,还可以考虑使用 Af x Me s s a g e Bo x ();可以 格式化一个消息或创建一个静态消息,用以指示应用程序通过一个关键部位时的过程,并用 Af x Me s s a g e Bo x ()显示这
13、些消息;Af x Me s s a ge Bo x ()甚至可以不必在一个控件窗口的类中,或者根本不必在一个类中.D.2.3 ASSERT()和VERIFY()另外两个用来检查工作的全局函数是 A S S E RT()和VERIFY(),这些宏通常用来检查传 送到一个函数的参数是否合法.如果这些参数来自用户的输入,可能还要用 Af x Me s s a g e Bo x ()显示某种错误消息;但是,如果该参数源于应用程序的其他部分,则可以使用具有更小系统 开销的ASSERT()和VERIFY(),MFC库用ASSERT()和VERIFY()防止任何愚蠢的错误导 致奇异的结果.在应用程序的调试版
14、中,ASSERT()和VERIFY()核查一个合法的 C或C+表达式,如果 不是TRUE,则显示一个错误消息并退出应用程序;在应用程序的发行版中,ASSERT()不做 任何事情 甚至不核查括弧内的表达式,VERIFY()虽然核查表达式,但如果发现错误,还 是不能停止应用程序的发行版.这两个宏的例子如下:/i f f a l s e,d e b u g a p p l i c a t i o n a b o r t s /s t a t e m e n t n o t e v a l u a t e o n r el e a s e /v e r s i o n VERIFY(Ge t Fi l
15、 e ()/i f f a l s e,d e b u g a p p l i c a t i o n a b or t s /s t a t e m e n t s t i l l e v a l u a t e d i n r e l e a s e /v e r s i o n ASSERT(t h i s)D.2.4 Du m p ()每个从C O b j e c t 派生的类都继承一个 D u m p 成员函数,该函数在概念上与 Se r i a l i z e ()相似,但是,它可以输出类中所有可读格式的成员变p a g e 2量,可以转储文档中的一个或所有对象,方法 与用Se r
16、 i a l i z e ()串行输出所有数据对象到磁盘(见例67)一样;但是,与Se r i a l i z e ()不一样的是,不是把存档类的实例传递给 Du m p (),而是把一个转储环境的实例传递给它.可以用默认的 a f x Du m p 转储环境,它将输出显示在 St u d i o 的调试窗口中,或者可以用一个文件:CFi l e f i l e;f i l e.Op e n(d u m p.t x t,CFi l e:m o d e Cr e a t e|CFi l e:m o d e Wr i te);下载 CDu m p Co n t e x t d c(&f i l e
17、);附录D 开发中注意事项 333 然后,用下面的语句转储一个对象:p Ob j e c t-Du m p(&d c);如果要实现一个完全转储系统,可以用菜单命令调用第一个 Du m p ()函数.然后,文档中 的所有其他 Du m p ()函数以递减的模式被调用.一个Du m p ()例子如下:v o i d CMy Da t a:Du m p(CDu m p Co n t e x t&d c)c o n s t COb j e c t:Du m p(d c);d c It e m 1=m _n It e m 1;d c It e m 2=m _n It e m 2;d c It e m 3
18、=er r.e r r 这将引起质问,从哪里得到一个.m a k 文件?更早版本的环境自动产生它们,然而,最新版 本使它成为用户必须设置的一个选项.4)单击De v e l o p e r St u d i o 的To o l s/Op t i o n s 命令,并选择Bu i l d 选项卡.5)然后,在保存工程时,确保设置了 Ex p o r t m a ke f i l e 选项.你可能不想为大型工程做这样工作,因为 m a k e f i l e 输出减慢了单个工程的保存;而更希望 每当工程改变时,简单地创建一个新的 m a k e f i l e;要用命令创建一个 m a k e f
19、 i l e,只需单击 Pr o j e c t/Up d a t e Ma k e f i l e.当在De ve l o p e r St u d i o 外面,以批处理模式建造时,则在 De v e l o p e r St u d i o 之内设置的目录 不再适用;编译器和连接器现在将使用定义在操作系统环境中的路径;因此,要再次使编译器 和连接器知道公共的i n c l u d e 和l i b 目录在哪里,必须把下面的语句添加到 De v e lo p e r St u d i o 中.l i b=l i b i n c l u d e=l i b p a t h=l i b (s
20、o t h a t d l l f i l e s c a n b e f o u n d)对于Wi n d o w s NT,必须用控制面版上的 Sy s t e m 应用程序改变系统变量,并应重新启动计 算机.D.3.7 Bu i l d Ma c h i n e 和De v e l o p e r Wo r k s p a c e 前面已提过,更新版本的 De v e l o p e r St u d i o 不能自动产生一个.m a k 文件,但是,它们使用 两个新文件:一个.d s p 文件(它跟踪单个工程),和一个.d s w 文件(它跟踪工作空间).一个工作 空间可能包含几个工程
21、,这些工程之间甚至相互具有依存;因此,如果使用更新版本的 De v e l o p e r St u d i o 的话,可能还想用这些应用程序按下面的步骤创建一个大工程.1)假设已有一些.d l l 或.e x e 工程子目录,用 De v e l o p e r St u d i o 打开主.e x e 工程的.d s w 文件.2)在De v e l o p e r St u d i o 的Pr o j e c t 菜单中,用 In s e r t Pr o j e c t i n t o Wo r k s p a c e 命令添加所有其他 应用程序到该工程的工作空间中.3)再次在 P r
22、 o j e c t 菜单下,用 D e p e n d e n c i e s 命令设置整个工程的所有依存.例如,选择 一个.e x e工程,然后单击所有必须在该工程建立前要建立的.d l l 工程.4)可以用Pr o j e c t/Se t Ac t i v e 命令确定要求De v e l o p e r St u d i o Bu i l d 或Bu i l d Al l 时建立哪一个工 下载 附录D 开发中注意事项p a g e 5 337 Bu i l d 程,如果想使主.e x e 工程成为主动的工程,则可以只通过单击 Bu i l d 或Bu i l d a l l 重建整个
23、工程.5)如果想建立整个工程的调试版和发行版,而在完成以后不必返回,可以用 D e v e l o p e r St u d i o 的Bu i l d 菜单,选择 Ba t c h Bu i l d 命令并选择一切以建造一切.6)该工作空间配置保存在.d s w 文件中,对于一个特别大的工程,可以考虑在 Ma c h i n e 上拥有一个包含整个工程的.d s w 文件.D.3.8 Bu i l d Ki t 规划一个大型应用程序的最后一步是创建一个 Bu i l d Ki t.一个Bu i l d Ki t 只是文件的一个选 项,任何人可以用来创建一个新版的应用程序,这包括 i n c
24、l u d e 和l i b 目录下的文件,以及建库 所用的源文件(可选).Bu i l d Ki t 应当驻留在 Bu i l d Ma c h i n e 中,并在建造下的一个单独的目录中,使K i t 单独设置一个目录允许被新的开发使用,即使在一个新建造中间也可以使用.并且,如 果新的建造不能正确地起作用时,在修复该建造时不延误任何他人的新工作;一旦一个建造 被证实起作用后,另一个批处理文件可以用来把它拷贝到 Bu i l d Ki t 目录中.D.4 Mi c r o s o f t 命名习惯 M i c r o s o f t 已为MFC C+编程时使用的程序变量设立了一种非正式的自
25、愿的命名习惯.尽 管这种习惯并不强求在创建一个 M F C应用程序时使用,也许并不总是实用的,但它确实有一 些优点.除了能给一个变量常规的描述名以外,用这种习惯还可以分辨一个变量的类型以及 是否一个类的成员变量.以下面符号开始的变量含义:m _ m _b m _n m _p m _d w m _c l a s s n a m e 一个类的成员变量 布尔变量 整型变量 指针变量 DWORD变量 在c l a s s n a m e 中指定的类类型 批评这种习惯的人指出,这有悖于语言的灵活性,例如在命名变量 m _b Fl a g 以后,现在要 将它转变为整型,而不编辑所有出现的地方或不管它,是非
26、常困难的,并有可能迷惑未来的 软件开发者.然而,据笔者个人经验,很少需要改变变量类型,而且能够迅速区别一个变量 做什么用,远远胜过它具有的不足.D.5 Sp y i n g 在V C+开发包中可能被忽略的应用程序是 SPY.EXE,这个小应用程序不仅可以帮助你指 出应用程序正在进行什么,而且正如其名字的含义一样,它能指出他人怎样在应用程序界面 中操作窗口.D.5.1 发现消息 可以读到想知道的所有关于哪一个窗口消息对于应用程序中的哪一个窗口是可用的,但 是,当所有应用程序的界面成份都被叠在一起时,每个人都会猜测什么消息是可用的.要确 338 第五部分 附 录 下载 切地发现这些消息,用 SPY
27、.EXE应用程序截获并显示每个可视窗口的所有消息.1)运行应用程序开始.2)然后执行SPY.EXE(这可以在MFC C+的b i n 目录下找到).3)单击Sp y 的Sp y/Me s s a g e 菜单命令,打开 Me s s a g e Op t i o n s 属性表.4)找到Fi n d e r To o l,并把它拖到想要监视的窗口.一个新的窗口将在 S p y 内打开,并开始显示进出那个窗口的窗口消息;从那里,用户可能 会看到一个未曾想过要处理的窗口消息.D.5.2 发现窗口 用那个相同的 Fi n d e r To o l,有时可以猜出他人怎样用他们的界面实现一个作用;例如,
28、可以确定该效果是否是以前不曾用过的窗口风格,还是其他应用程序开发者自己开发的.如 前面一样抓住 Fi n d e r To o l,但是现在把它拖到当前考虑效果的窗口中,下面窗口的大小将被 突出显示,并显示出它的类和风格.有时,你可能为所发现的效果而惊讶!D.6 其他实例资源 如果不能在本书中找到一个需要的例子,在本书之外还有其他例子资源,如你的 V C+发 布工具C D带有它自己的例子目录;另外一个优秀的,但是不常用的例子资源是创建 M F C类库 的源文件集,可以在 V C+的 m f c s r c 目录下找到,这里也是查找非文档化虚拟 M F C函数的地 方.另一个例子资源可以在 In t e r n e t 上找到p a g e 6:f t p:/f t p.m i c r o s o f t.c o m/So f t l i b/MSLFILES/但是必须在 3A.M.时间访问它,并且它只限 2500个用户访问.p a g e 7