友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
喜书网 返回本书目录 我的书架 我的书签 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)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!