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

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

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






//系统菜单的改变可能更具创造性  


…………………………………………………………Page 232……………………………………………………………

}  



void CMainFrame::OnFileNew()   



{  



// TODO: Add your mand handler code here  



CMainFrame::OnDrawRectangle();  



MessageBox(〃I've drawn a rectangle!〃);  



//系统菜单中的一个消息响应函数,它的编写没有什么特殊之处  



}  



//以下为函数MenuView。cpp的代码  



// MenuView。cpp :类CMenuView的实现  



//  



#include 〃stdafx。h〃  



// 。。。  



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



// CMenuView  



IMPLEMENT_DYNCREATE(CMenuView; CView)  



BEGIN_MESSAGE_MAP(CMenuView; CView)  



//{{AFX_MSG_MAP(CMenuView)  



ON_WM_RBUTTONDOWN()  



//}}AFX_MSG_MAP  



END_MESSAGE_MAP()  



//以上为消息响应人口  



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



// CMenuView construction/destruction  



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