友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
C语言实例教程(PDF格式)-第25部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
基础知识。
即使是Microsoft Windows的临时用户也知道,在应用程序的主窗口
的顶部会出现一个菜单条,在Windows 95中,Microsoft还提示使用
对象的上下文菜单。用户所需要做的,简单到只需要轻轻单击一下鼠
标右键就可以了。(在后面的程序设计中,我们会看到,要是你觉得
使用双击右键更有意思的话,作出这种改变几乎没有什麽更多的工
作。)同时,我们也会向你展示实现图符菜单的简单方法。在该节的
最后,我们还会介绍如何对系统菜单进行操作。
加速器是这样的一个按键,程序负责将这一按键解释成一个命令,从
用户程序的角度看,在菜单选择与加速器按键的选择并没有什麽差
别,这是通过Windows为二者生成相同的消息决定的。对于程序员来
说,将加速键显示在相应菜单的右侧是一个良好的习惯,它为熟练用
户提供了进行更方便选择提供了一种可能性。但是从程序设计的角度
看二者却是分别定义的………菜单是用菜单资源定义的,而加速键是用
加速键资源定义的。
工具条是第三种命令输入机制。工具条是一个带有按钮的窗口,它使
用户发出命令的动作节省到在相应按钮上按一下鼠标即可。当然,由
于工具条本身也要占据屏幕空间,因此,放在工具条上的命令应该是
最常用的。而且,出于对用户的尊重,在用户不希望使用它的时候,
应该能将工具条隐去。AppWizard 自动创建的工具条提供这种能力,
但我们会对此作出更详细的解释。
在本章的最后,我们会对一些在Windows下常用的控件,比如滑块控
件,进度条以及上下控件的一些基础知识。总得来说,我们准备在本
章中介绍如下知识:
…………………………………………………………Page 203……………………………………………………………
l 菜单消息响应
l 快捷键消息响应
l 工具条消息响应
l 对上下控件、进度条、以及轨道消息响应
第一节 菜单消息响应
在程序接口中,我们最常用的选择方式就是用菜单进行选择。而对于
从程序员来说,我们所要做的很大一部分工作,就是对程序的输入进
行响应。无庸置疑,菜单可以有多种实现的方式。从用户的使用角度
来说,当然希望可以有多种多样的选择。我们常常建立下拉菜单,也
可以建立一些必要的图符菜单,当然在必要的时候,我们业应该建立
一种使用上更便捷的上下文菜单。而在很多情况下,我们希望对菜单
进行动态的操作――在许多时候,这甚至是一种很重要的事情,对在
我们下面的章节中也会有所提及。
从下面开始,我们将按以下的顺序对菜单消息的响应进行讲解。
让我们先看看怎样在资源编辑器中实现菜单。
首先新建一个基于单文档界面的程序,这只需要在AppWizard新建程
序的第一步(如图5。1)中在Application Type选择时选择Single
document即可。
图5。 1 建立单文档界面程序:Step1
…………………………………………………………Page 204……………………………………………………………
我们设该应用程序的名称为Menu。同时,由于是首次建立不是基于对
话框的程序,我们简单的说一下建立的过程。(基于对话框的程序
AppWizard只需要四步,而基于文档的程序需要六步。)
在第二步(如图5。2所示)中,我们将设定数据库支持,由于我们现在
建立的只是简单的单文档程序,我们选择不需要任何数据库支持。
在第三步 (如图5。3所示)中,我们将设定生成的标准程序中的文档
支持。AppWizard提供有容器类 (Container)与服务类 (Server)应用,
我们保持缺省设置。(不需要容器类与服务类支持,但保留ActiveX
Control控件支持。)
图5。 2 建立单文档界面程序Step 2
图5。 3 建立单文档界面程序Step 3
…………………………………………………………Page 205……………………………………………………………
在第四步(如图5。4)中;我们去除掉打印预览及打印支持。但我们保持
工具条,状态条,三维控制支持。对刚使用的文件列表数设置为四。
在第五步(如图5。5)中,我们将设定是否设置提示及怎样使用MFC库。
在刚开始时,我们设定需要提示,同时,动态链接MFC库。
在最后一步中(如图5。6)中,我们将设定AppWizard将要为我们生成的
类。
图5。 4 建立单文档界面程序Step 4
图5。 5 建立单文档界面程序Step 5
这样,我们就建立起一个具有Document/View结构的简单的应用程
序。
…………………………………………………………Page 206……………………………………………………………
在进行进一步的编程以前,我们希望你能对照在第四章中对基本框架
的解释,对产生的其它文件 (MenuDoc和MenuView)我们将在第六章中
作详细的解释,现在读者要是理解得不大清楚,可以先跳过去这一部
分。在作进一步的编程之前,建议读者先将AppWizard生成的程序编
译,运行,看看AppWizard都为我们实现了什麽功能。
图5。 6 建立单文档界面程序Step 6
下面我们对程序的菜单作一些修改。
图5。 7 菜单资源IDR_MAINFRAME0
图5。 8 菜单资源IDR_MAINFRAME1
…………………………………………………………Page 207……………………………………………………………
图5。 9 系统菜单
如图5。7所示;为我们的程序运行菜单的一个画面。该菜单的属性为
IDR_MAINFRAME0
而下面的两个图片为我们的应用程序运行时的另外一组菜单。该菜单
的属性为IDR_MAINFRAME1。
在程序中;我们的改变了Help和Draw菜单;如图5。8所示。
最后;我们改变了系统菜单;并改变了其中的一个选项的功能。如图5。9
所示。
作为补充;下面我们看一下程序所实现的绘图以及系统菜单被改变后
实现的功能(如图5。10所示)。
图5。 10 程序的一个运行画面 (系统菜单中新增菜单被选择)
我们认为;通过第四章中基于对话框的程序以后;读者应该已经掌握了
实现菜单的修改的方法;但为了下面描述的方便;我们在此列出各菜单
项的属性。
l 注意:
…………………………………………………………Page 208……………………………………………………………
l 下面的代码摘自菜单完成后的文件Menu。rc中(该文件以文本形式
保存;可以用写字板或者记事板打开。为了更清楚地理解下面的代
码,我们粗略的讲解一下菜单资源的语法:
关键字POPUP表明其后的BEGIN与END之间的为其弹出式子菜单
的内容。
关键字MENUITEM标识一具体的子菜单内容。MENUITEM后所跟
的第一部分为 菜单标题,其最后一部分则为标识该菜单项的
ID号。需要注意的是,具有子菜单的弹出式菜单项是没有标
识的ID号的。
l 我们程序的最初的菜单;并不包含程序执行后结果的一些菜单;最
初的菜单中仅仅包含前四幅图中的菜单。
l IDR_MAINFRAME0 MENU PRELOAD DISCARDABLE
l BEGIN
l POPUP 〃&File〃
l BEGIN
l MENUITEM 〃&NewtCtrl+N〃; ID_FILE_NEW
l MENUITEM 〃&Open。。。tCtrl+O〃; ID_FILE_OPEN
l MENUITEM 〃&SavetCtrl+S〃; ID_FILE_SAVE
l MENUITEM 〃Save &As。。。〃; ID_FILE_SAVE_AS
l MENUITEM SEPARATOR
l MENUITEM 〃&Print。。。tCtrl+P〃; ID_FILE_PRINT
l MENUITEM 〃Print Pre&view〃; ID_FILE_PRINT_PREVIEW
l MENUITEM 〃P&rint Setup。。。〃; ID_FILE_PRINT_SETUP
l MENUITEM SEPARATOR
l MENUITEM 〃Recent File〃; ID_FILE_MRU_FILE1; GRAYED
l MENUITEM SEPARATOR
…………………………………………………………Page 209……………………………………………………………
l MENUITEM 〃E&xit〃; ID_APP_EXIT
l END
l POPUP 〃&Edit〃
l BEGIN
l MENUITEM 〃&UndotCtrl+Z〃; ID_EDIT_UNDO
l MENUITEM SEPARATOR
l MENUITEM 〃Cu&ttCtrl+X〃; ID_EDIT_CUT
l MENUITEM 〃&CopytCtrl+C〃; ID_EDIT_COPY
l MENUITEM 〃&PastetCtrl+V〃; ID_EDIT_PASTE
l END
l POPUP 〃&View〃
l BEGIN
l MENUITEM 〃&Toolbar〃; ID_VIEW_TOOLBAR
l MENUITEM 〃&Status Bar〃; ID_VIEW_STATUS_BAR
l MENUITEM 〃&Long menu〃; ID_VIEW_LONGMENU
l END
l POPUP 〃&Draw〃
l BEGIN
l MENUITEM 〃&Line〃; ID_DRAW_LINE
l MENUITEM 〃&Circle〃; ID_DRAW_CIRCLE
l MENUITEM 〃&Rectangle〃; ID_DRAW_RECTANGLE
l MENUITEM 〃&Bitmap〃; ID_CHANGE
l END
…………………………………………………………Page 210……………………………………………………………
l POPUP 〃&Help〃
l BEGIN
l MENUITEM 〃&About Menu。。。〃; ID_APP_ABOUT
l END
l END
l
l IDR_MAINFRAME1 MENU DISCARDABLE
l BEGIN
l POPUP 〃&File〃
l BEGIN
l MENUITEM 〃&NewtCtrl+N〃; ID_FILE_NEW
l MENUITEM 〃&Open。。。tCtrl+O〃; ID_FILE_OPEN
l MENUITEM 〃&SavetCtrl+S〃; ID_FILE_SAVE
l MENUITEM 〃Save &As。。。〃; ID_FILE_SAVE_AS
l MENUITEM SEPARATOR
l MENUITEM 〃&Print。。。tCtrl+P〃; ID_FILE_PRINT
l MENUITEM 〃Print Pre&view〃; ID_FILE_PRINT_PREVIEW
l MENUITEM 〃P&rint Setup。。。〃; ID_FILE_PRINT_SETUP
l MENUITEM SEPARATOR
l MENUITEM 〃Recent File〃; ID_FILE_MRU_FILE1; GRAYED
l MENUITEM SEPARATOR
l MENUITEM 〃E&xit〃; ID_APP_EXIT
l END
…………………………………………………………Page 211……………………………………………………………
l POPUP 〃&View〃
l BEGIN
l MENUITEM 〃&Toolbar〃; ID_VIEW_TOOLBAR
l MENUITEM 〃&Status Bar〃; ID_VIEW_STATUS_BAR
l MENUITEM 〃&Normal menu〃; ID_VIEW_NORMALMENU
l END
l POPUP 〃&Dyncmodify〃
l BEGIN
l MENUITEM 〃&Insert a menuitem〃; ID_DYNCMODIFY_INSERT
l MENUITEM 〃&Delete a menuitem〃; ID_DYNCMODIFY_DELETE
l MENUITEM 〃&Append a menuitem〃; ID_DYNCMODIFY_APPEND
l MENUITEM 〃&Modify help〃; ID_DYNCMODIFY_MODIFY
l MENUITEM 〃M&odify system menu〃; ID_DYNCMODIFY_MODIFYSYSTEMMENU
l MENUITEM 〃&Reset system menu〃; ID_DYNCMODIFY_RESET
l END
l POPUP 〃&Help〃
l BEGIN
l MENUITEM 〃&About Menu。。。〃; ID_APP_ABOUT
l END
l END
l
l IDR_CONTEXTMENU MENU DISCARDABLE
l BEGIN
…………………………………………………………Page 212……………………………………………………………
l POPUP 〃dummy〃
l BEGIN
l MENUITEM 〃&Line〃; ID_DRAW_LINE
l MENUITEM 〃&Circle〃; ID_DRAW_CIRCLE
l MENUITEM 〃&Rectangle〃; ID_DRAW_RECTANGLE
l END
l END
图5。 11 上下文菜单的一个运行画面
为了建立弹出式菜单,在上述代码中,我们发现还有一个菜单
IDR_CONTEXTMENU没有提及。它在该文件中与其它菜单的表现形式是
一样的。下图为弹出式菜单的一个运行画面。
下面我们看看怎样改变菜单项的缺省名称。如图5。12所示,在
WorkSpace中于IDR-MAINFRAME上右击鼠标,在弹出式菜单中选择属
性项 (Property),在接下来的属性设置对话框中在ID设置区输入后
者从下拉列表选择所需的菜单ID号即可。依此处理其它各菜单项。
l 注意:
l 菜单项ID号的设置务请同我们给 出的保持一致,由于ID号是辨识
菜单消息的唯一手段,此处的差别将会导致你在下面的学习过程
中将不得不跟我们给 出的代码有一些差异。
…………………………………………………………Page 213……………………………………………………………
图5。 12 改变菜单项ID值
现在,试着运行一下我们的程序,会发现它并没有能比最初的
AppWizard建立的标准程序多做些什么。这是必然的,毕竟,我们还
没有编写一行让它动起来的代码吗 !不过不要紧,我们接下来所要做
的,就是这项工作。(不用担心IDR_MAINFRAME0对IDR_MAINFRAME的
替代会有什么不良结果,实际上,ClassWizard监测到这些,并已在
程序代码中作了相应的变动以反应这一变化。)
首先,由于对菜单的动态改变在菜单IDR_MAINFRAME1的菜单项中实
现,因此,我们所要做的第一步工作
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!