友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第33章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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的临时用户也知道,在应
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!