友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

C语言实例教程(PDF格式)-第28部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!




CMenuView::CMenuView()  



{  


…………………………………………………………Page 233……………………………………………………………

// TODO: add construction code here  



//CMenuView类构造函数,在文档/视一章中我们将对此作详细的解释  



}  



CMenuView::~CMenuView()  



{  



//CMenuView类析构函数,在文档/视一章中我们将对此作详细的解释  



}  



BOOL CMenuView::PreCreateWindow(CREATESTRUCT& cs)  



{  



// TODO: Modify the Window class or styles here by modifying  



// the CREATESTRUCT cs  



//在此处可以改变窗口的实现  



return CView::PreCreateWindow(cs);  



}  



/////////////////////////////////////////////////////////////////////////////  



// CMenuView drawing  



void CMenuView::OnDraw(CDC* pDC)  



{  



CMenuDoc* pDoc = GetDocument();  



ASSERT_VALID(pDoc);  



//文档绘图调用函数  



// TODO: add draw code for native data here  



}  



// CMenuView diagnostics  



// 。。。  



//以上部分为调试代码时用,在程序的发行版中将被移去  


…………………………………………………………Page 234……………………………………………………………

CMenuDoc* CMenuView::GetDocument( ) // 该函数非调试时为内联函数  



{  



ASSERT(m_pDocument…》IsKindOf(RUNTIME_CLASS(CMenuDoc)));  



return (CMenuDoc*)m_pDocument;  



}  



//获得文档指针  



#endif //_DEBUG  



/////////////////////////////////////////////////////////////////////////////  



// 以下为CMenuView 类消息处理函数  



//下面的代码处理了右击鼠标时上下文菜单的处理,当然,你也  



//可以改在别的鼠标事件时使用上下文菜单  



void CMenuView::OnRButtonDown(UINT nFlags; CPoint point)   



{  



// TODO: Add your message handler code here and/or call default  



CMenu contextMenu;  



if(!ContextMenu。LoadMenu(IDR_CONTEXTMENU))  



AfxThrowResourceException();  



//装入上下文菜单资源,装入失败时调用异常处理函数  



CMenu *pPopupMenu=ContextMenu。GetSubMenu(0);  



ASSERT(pPopupMenu!=NULL);//使用断言,方便调试  



ClientToScreen(&point);//转换客户区坐标至屏幕坐标  



pPopupMenu…》TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON;  



point。x;point。y;AfxGetMainWnd());//将菜单作为上下文菜单显示  



CView::OnRButtonDown(nFlags; point);  



}  



//以上部分为上下文菜单的处理函数  


…………………………………………………………Page 235……………………………………………………………

//以下部分代码摘自MainFrm。h中  



// 。。。  



// Attributes  



public:  



BOOL bInsert;  



BOOL bAppend;  



BOOL bDelete;  



BOOL bModify;  



BOOL bBitmap;  



//以上部分代码为控制变量  



CMenu hLongMenu;  



CMenu hNormalMenu;  



//以上部分为菜单资源对象  



// 。。。  



                        第二节 工具条  



首先让我们从MFC控制条谈起。  



MFC的工具条类CToolBar是几种可创建用来接收某些命令输入并向用 

户显示状态消息的类中的一用户可以用工具条来立即访问程序命令。 

工具条是直接可以看到的,而不是象菜单那样需要一层一层的深入, 

或象键盘那样需要记忆。由于它占用屏幕空间,因此一定要确保你的 

工具条包括的是最经常使用的命令。大型程序通常有多个工具条来为 

不同的用户任务服务。即使你的程序只有一个工具条,也要使用户在 

感觉它碍事时能将其藏起来。  



从编程的角度看,工具条是一个显示一系列位图按钮的子窗口。一旦 

创建了工具条并使其可见,就不能再忽略它,因为它将和菜单与加速 

键一样生成WM_MAND消息。但应使工具条的命令ID与菜单和加速键 

的命令ID同步。  



在这一节中,将介绍几个有关工具条的问题。我们将首先看看工具条 

在MFC层次结构中的位置,然后我们再介绍有关动态创建和修改工具 


…………………………………………………………Page 236……………………………………………………………

条的若干细节,最后,我们将说明工具条定位与消隐的一些技术并给 

出一个相应的较小的例程。我们计划按下列顺序讲解:  



  l MFC控制条  



  l 创建工具条  



  l 显示和隐藏工具条  



从图5。18中可见工具条类的基本类为CControlBar,而该基本类是由 

CWnd类派生的。掌握这个继承关系对我们来说是很有用的。例如,由 

于所有的控制条都是有CWnd类派生的,所有的控制条都连接到一个 

Windows  APIH窗口。因此,CWnd的所有功能――创建、移动、显示和 

隐藏窗口――在用控制条工作是都是可用的。  



CToolBar类有几个兄弟类,包括CStatusBar和COleResizerBar, 

CDialotBar。当发生请求时,AppWizard通过创建一个CStatusBar对象 

来创建一个状态条。正如我们在介绍菜单时所提到的,状态条位于帧 

窗口的底部并显示有关菜单选择的帮助消息。当用户在各按钮上移动 

鼠标时,状态条也显示关于不同工具条按钮的详细帮助信息。  



                                



               图5。 18 类CToolBar继承关系图  



CDialogBar类创建对话条,它位于工具条和对话框之间。对话条能够 

象对话框那样起控制作用,但它象一个工具条那样位于帧窗口中。我 

们对此不打算作详细介绍,有兴趣的读者可以参考有关书籍。  



MFC控制条COleResizerBar可以改变在为OLE对象的大小。  



MFC的工具条 (和对话条)都是可迁移的。如允许这一特性,用户就 

可将一个工具条移到一个具有不同边界的帧窗口中。但它将根据这一 

新窗口的边界而更新以表明它所迁移的位置。此外,工具条还可被移 

出帧边界并被放到空闲的调色板上。  



MFC工具条也支持工具便笺,工具便笺可帮助用户理解单独一个位图 

按钮的作用。如允许这一特性,用户就可通过将鼠标光标移到一个工 


…………………………………………………………Page 237……………………………………………………………

具条按钮上 (并不单击按钮)来调用工具便笺支持。过一会儿以后, 

就会在工具条按钮上方的一个小的正文窗口中显示工具便笺――一个 

简略的字或短语。  



为在你的MFC程序中使用工具条,必须协调使用位图资源,包括工具 

条自身以及帧窗口等几项。为帮助用户对此的理解。在后面我们将介 

绍如何创建自己的工具条。  



下面我们创建一个工具条。AppWiard 自动生成一个工具条。但它的某 

些特性,比如象显示和隐藏工具条,则被隐藏在现有MFC类中。为了 

能更详细地介绍工具条,我们将创建另一个菜单。在此之后,我们将 

说明两个工具条如何共处于同一个程序中。这样,你就将看到创建一 

个附加的工具条是多么容易。  



创建工具条分五步。首先要创建按钮映象的位图。其次要建立一个将 

按钮映射到你的程序命令码的数组。第三要编写创建工具条并将其适 

当初始化的程序。一旦工具条窗口被创建,第四步和第五步是将按钮 

映象和命令ID与工具条相连接。一旦这些基本步骤完成后,就可采取 

其它步骤来进一步改善工具条。下面我们分别讲解。  



1。   创建按钮映象位图。应将该位图作为位图资源存储起来。如图 

5。19,打开资源编辑器,将按钮映象的位图创建到一行中。每个映象 

的缺省大小是16×15象素。如果你希望使用别的大小,那么你就需要 

调用函数CToolBar::SetSize通知应用程序相应的改变。该函数的相 

关信息可以通过系统的帮助信息获得,在此不再赘述。  



                                 



               图5。 19 建立工具条位图资源  



2。   定义命令码数组。映射按钮映象到命令ID号。下面的代码摘自例 

程,无符号整形数组 (UINT)为上图所示工具条按钮的对应数组。  



3。   创建并初始化工具条对象。与其它创建过程类似,采用两步法生 

成:先声明对象,再调用初始化函数CToolBar::Create生成。该函数 

原型为:  



BOOL Create( CWnd* pParentWnd; DWORD dwStyle=WS_CHILD| WS_VISIBLE | CBRS_TOP;  

UINT nID = AFX_IDW_TOOLBAR );  


…………………………………………………………Page 238……………………………………………………………

该函数中参数pParentWnd为指向工具条所在父窗口的指针 (别忘了工 

具条本身也是窗口 !),dwStyle为工具条的风格说明,其取值如表 

5。1所示:  



该函数最后一个参数表示工具条子窗口的ID号。  



如下述代码生成一工具条:  



d_pToolBar=new CToolBar( );  



d_pToolBar…》Create(this;WS_CHILD|CBRS_TOP;0x9100);  



                       表5。 1 工具条风格  



              标志         简单描述  



              WS_VISABLE  使工具条窗口初始可见  



              CBRS_BOTTOM  初始时将工具条放到窗口底部  



              CBRS_FLYBY  鼠标光标在按钮上暂停时,显 

                         示命令描述  



              CBRS_NOALIGN   防止控制条在其父窗口改变大 

                         小时被复位  



              CBRS_TOOLTIPS  鼠标光标在按钮上暂停时,显 

                         示工具便笺  



              CBRS_TOP   初始时将工具条放在窗口底部  



4。   将储存在位图资源中的按钮映象与程序的工具条相连接。这可以 

通过函数调用CToolBar:LoadBitmap达到。该函数原型为:  



BOOL LoadBitmap( LPCTSTR lpszResourceName );  



BOOL LoadBitmap( UINT nIDResource );  



该函数提供的重载两个不同版本,使我们既可以通过指向位图资源的 

指针调用,也可以通过该位图的ID号调用达到。  



如下段代码:  



d_pToolBar…》LoadBitmap(IDR_TOOLS);  



5。   作为该过程的最后一步,我们需要将按钮与命令ID联系起来。这 

可以用一个在第二步中创建的数组的指针来调用函数 


…………………………………………………………Page 239……………………………………………………………

CToolBar::SetButtons达到,该函数的原型为:  



BOOL SetButtons( const UINT* lpIDArray; int nIDCount );  



其中参数lpIDArray为指向一命令ID数组的指针。当然,为了使用不 

含按钮的工具条,该参数可能为NULL,参数nIDCount为前一数组中的 

元素个数。  



一般来说,我们可以这样编写我们的程序:  



d_pToolBar…》SetButtons(buttons;sizeof(buttons)/sizeof(UINT);  



到此为止,我们所创建的工具条已经实现。当然,我们可能仍然需要 

以别的方式改善工具条的操作。对于一般要求来说,最常用的操作也 

许就是移动和显隐切换了。  



我们先谈其移动。在缺省状况下,一个CToolBar工具条只能被应用程 

序所移动。但也可以使用户能够将工具条移到帧的另一部分。为此, 

需向工具条及帧窗口发送消息。这可通过调用 

CToolBar::EnableDocking和CFrame::EnableDocking实现。二函数原 

型均如下:  



void EnableDocking( DWORD dwStyle );  



其中参数dwStyle为工具条风格,对CToolBar其取值可如下:  



而对于CFrame,风格值CBRS_FLOAT_MULTI不可用。  



下面这段代码几乎也是标准的:  



d_pToolBar…》EnableDocking(CBRS_ALIGN_ANY);  



EnableDocking(CBRS_ALIGN_ANY);  



                      表5。 2 工具条停靠风格  



           风格             含义  



           CBRS_ALIGN_TOP  工具条可在客户区顶端移动  



           CBRS_ALIGN_BOTTOM  工具条可在客户区底端移动  



           CBRS_ALIGN_LEFT  工具条可在客户区左端移动  



           CBRS_ALIGN_RIGHT  工具条可在客户区右端移动  


…………………………………………………………Page 240……………………………………………………………

           CBRS_ALIGN_ANY  工具条可在客户区任意位置移动  



           CBRS_FLOAT_MULTI  允许在一单边窗口内存在多个可 

                        移动控制条  



用户也可以将工具条移动或定位。或者在程序控制下,通过调用 

CFrameWnd::DockControlBar来移动以及调用 

CFrameWnd::FloatControlBar来定位一工具条。它们的原型及参数如 

下所示:  



void DockControlBar( CControlBar * pBar; UINT nDockBarID = 0; LPCRECT lpRect =  

NULL );  



其中pBar为指向欲移动的工具条的指针,nDockBarID决定框架窗口哪 

一边可移动。它为0时,则控制条可任意移动,它取值 

AFX_IDW_DOCKBAR_TOP,AFX_IDW_DOCKBAR_           BOTTOM, 

AFX_IDW_DOCKBAR_LEFT,AFX_IDW_DOCKBAR_RIGHT时,分别表示控制 

条可移动至框架窗口的顶端,底端,左端及右端,该函数最后一个参 

数标识控制条可放置的框架非客户区的屏幕坐标。  



第二个函数的原型及参数读者不妨从系统帮助文件中查到。  



例如,我们可以这样编写代码:  



d_pToolBar…》EnableDocking(CBRS_ALIGN_ANY);  



EnableDocking(CBRS_ALIGN_ANY);  



接下来我们再谈谈工具条的显隐控制。由于工具条是一个窗口,它的 

显隐可以通过其父类CWnd的成员函数实现。  



在我们要改变工具条状态前知道当时工具条的状态有时是至关重要 

的,工具条的可视性可以通过函数CWnd::GetStyle拣取。该函数不带 

参数,其原型为:  



DWORD GetStyle( ) cons
返回目录 上一页 下一页 回到顶部 1 1
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!