按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
用垂直分隔线隔开。
MF_MENUBREAK 将项放到新的一行,或弹出菜单的
新的一列。列之间没有任何分隔
线。
MF_OWNERDRAW 指定项为一个自绘制项。当菜单第
一次显示时,拥有该菜单的窗口将
收到消息WM_MEASUREITEM,该消息
包括了菜单项的高度和宽度。而每
次当需要更新菜单项的显示外观
时,将发送消息。该选对顶层菜单
项无效。
WM_POPUP 指定该菜单项具有一个相关联的弹
出菜单。ID参数指定与该项相关的
弹出菜单句柄。该标志用来添加顶
层弹出菜单或将一弹出菜单添加到
另一弹出菜单。
WM_SEPARATOR 绘制一个水平分隔线。仅用于弹出
式菜单。该行不可以变灰,不可以
被禁止,也不可以被加亮,并且其
它参数被忽略。
MF_STRING 指定菜单项为一字符串。
如果由函数GetSystemMenu返回的指针不为空,则通过一个CString对
象strAboutMenu从资源文件中加载字符串IDS_ABOUTBOX。如果成功的
话 (通过检验strAboutMenu是否为空来判断),将该菜单项添加到控制
菜单中。
添加菜单项使用类CMenu的成员函数AppendMenu。该函数具有如下的
原型:
BOOL AppendMenu( UINT nFlags; UINT nIDNewItem = 0; LPCTSTR lpszNewItem = NULL );
BOOL AppendMenu( UINT nFlags; UINT nIDNewItem; const CBitmap* pBmp );
第一个参数nFlags指定了在新添加菜单时关于新增菜单项的状态的信
息。它可以为表4。4所列的一个或多个值。需要注意的事是表4。4中所
列的某些标志是互斥的,也就是说这其中的一些标志不可以同时使
用。关于这方面的详细信息请参考Visual C++中关于成员函数
AppendMenu的联机文档。
…………………………………………………………Page 198……………………………………………………………
l 注意:
l 在程序设计中 (尤其是在涉及到图形编程时!),图形化的菜单
是不是对用户具有更大的吸引力?要达到这一点,在菜单编程中
使用位 图参数就大功告成了 !是不是相 当简单?
如果nFlags参数被设置为MF_POPUP,参数nIDNewItem为一个弹出菜单
的句柄;如果nFlags参数被设置为MF_SEPARATOR,该参数被忽略;对
于其它情况,它为新增菜单项的命令ID。
随着参数nFlags的不同,参数lpszNewItem具有不同的解释,如表4。5
所示。
表4。 5 nFlags参数不同时对lpszNewItem参数的不同解释
Nflags的值 对lpszNewItem的解释
MF_OWNERDRAW 包括一个由应用程序提供的32位值,
应用程序使用该值来维护与该菜单项
相关联的附加数据。该32位值在应用
程序处理消息WM_MEASUREITEM和
WM_DRAWITEM时可用,它被保存在这
些消息提供的结构的itemData成员
中。
MF_STRING 包括指向以null结束的字符串的指
针。
MF_SEPARATOR lpszNewItem参数被忽略。
在第二种格式的成员函数AppendMenu中,参数pBmp指向一个CBitmap
对象,该对象将被用作菜单项。
函数SetIcon用来将句柄设置为某一特定图标,该图标由第一个参数
标识。第二个参数指定和图标的大小,如果该参数为真,表示图标为
32象素' 32象素大小;如果为假,表示图标为16象素' 16象素大小。
最后,由于我们没有将输入焦点设置为某一个特定的控件,因此消息
处理函数OnInitDialog返回真值TRUE。
(3) 消息处理成员函数OnSysmand
类CDialogDemoDlg的OnSysmand成员函数非常之简单,首先它检查
用户选择的命令是否IDM_ABOUTBOX (注意在if语句中使用了表达式
nID & 0xFFF0),如果是的话,声明一个类CAboutDlg的对象,调用该
…………………………………………………………Page 199……………………………………………………………
对象的DoModal成员函数以模态方式显示该对话框;否则,函数
OnSysmand调用基类的成员函数OnSysmand。前面已经提到过,
对于应用程序自己添加的控制菜单项 (如这里的IDM_ABOUTBOX),不要
调用基类提供的成员函数OnSysmand进行默认处理。
(4) 消息处理成员函数OnPaint
首先,类CWnd的成员函数IsIconic用来判断一个窗口是否被最小化。
如果是,函数IsIconic返回真值 (非零值);反之,返回假值 (零)。如
果IsIconic返回真,则以当前this指针 (它指向当前CDialogDemoDlg
对象)为参数构造类CPaintDC的对象dc。类CPaintDC封装了Windows应
用程序重绘时所使用的设备描述表。然后,成员函数SendMessage向
窗口发送一条WM_ICONERASEBKGND消息,该条消息表示在重画被最小
化的窗口的图标之前需要对图标背景进行填充。而类CDC的成员函数
GetSafeHdc返回该类的成员函数m_hDC,即相应的输出设备上下文,
该设备上下文作为WM_ICONERASEBKGND 的wParam参数被发送。
接着成员函数OnPaint分别以SM_CXICON和SM_CYICON有参数调用Win32
API函数GetSystemMetrics (注意它并不是类CDialogDemoDlg及其基
类,典型的如CWnd的成员函数),从而得到以象素为单位的图标默认
宽度和高度,图标大小的典型值为32' 32,但我们不可以在应用程序
中作此假设,因为它依赖于所安装的显示硬件,并可能随用户对系统
设置的改变而改变。
然后类CWnd的成员函数GetClientRect将当前客户区矩形的度量放入
第一个参数所指向的CRect对象中。类CRect封装了由左上角和右下角
所确定的一个矩形。其成员函数Width和Height分别返回所确定矩形
的宽和高。然后通过计算得到使图标居中的坐标。最后调用类CDC的
成员函数DrawIcon绘制由m_hIcon所标识的图标。
如果当前窗口并未被最小化,类CDialogDemoDlg的OnPaint成员函数
调用基类提供的相应成员函数。
(5) 消息处理函数OnQueryDragIcon
消息处理函数OnQueryDragIcon只是简单的返回句柄m_hIcon,并将其
类型强制转换为HCURSOR。
程序所使用的资源如图4。9所示。
…………………………………………………………Page 200……………………………………………………………
a。 类CAboutDlg所对应的对话框
b。 类CDialogDemoDlg所对应的对话框
c。 对话框CDialogDemoDlg所用的图标
图4。 9 在应用程序DialogDemo中所用到的资源
现在即可编译并运行应用程序DialogDemo,其结果如图4。10。通过单
击控制菜单中的项 “关于DialogDemo”,可以打开如图4。9中a所示的
对话框。而无论单击 “确定”还是 “取消”,应用程序DialogDemo都
将被关闭。
图4。 10 应用程序DialogDemo的运行结果
第五节 小结
本章详细的分析了由AppWizard生成的一个基于对话框的应用程序,
这是进行下一步对控件的学习的基础。同时,我们还借用该程序说明
了使用MFC编写的应用程序的结构,涉及到了以下的一些内容:
l 从CWinApp派生的应用程序类
…………………………………………………………Page 201……………………………………………………………
l MFC应用程序的消息映射机制和方法
l 从CDialog派生的对话框类 (这里CDialog又从CWnd派生)
我们在这些内容上花费了大量的篇幅,但就算是这样还是未能将其完
全的阐述清楚。它们是一些比较复杂,但并不神秘的东西,然而一旦
理解了这些东西,那么你对MFC的理解立刻就会上升一个层次,从而
在实际编程的过程中获益更多。
在本章,我们对代码进行几乎是逐行逐字的讲解和说明,这是考虑到
初学者对于MFC的编程方式比较陌生的情况。在后面几章的内容中,
我们对于一些关系不是很紧密的内容不再作详细的讲述,你需要随时
查阅Visual C++的联机文档,好在里面有数不清的资源可以利用。但
是应该记住一点,我们建议你弄懂示例程序中的每一行所完成或实现
的功能,只有这样,才能充分利用这些经过实践证明是可行的编程方
法和技巧,从而在比较短的时期内很快的提高自己的编程水平和能
力。
…………………………………………………………Page 202……………………………………………………………
第五章 响应用户命令
我们很容易想见,在Windows 95程序设计中,一个很重要的方面就是
对各种消息的响应。而在这其中,各种输入命令的响应又几乎占据着
最重要的地位。就象我们在前面的章节中所介绍的那样,窗口可以说
是Microsoft Windows的最重要的用户界面对象,而第二重要的用户
界面对象就得算是菜单了,用户选择可用命令的一个最常用,也是最
重要的手段就是菜单。这一点,通过查看Windows API中菜单所支持
的庞大的功能也可以更直观的看出。当然,我们也可以发现,在一些
情况下,我们可以有更快捷,有时也更有效的命令输入方式,就是使
用加速键或者工具条。当然,出于对界面介绍的完整性考虑,我们在
本章的末尾,也会简单的介绍滑块控件,进度条以及一些上下控件的
基础知识。
即使是Microsoft Windows的临时用户也知道,在应