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

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

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


参数,其原型为:  



DWORD GetStyle( ) const;  



函数返回当前控制条风格值。  



而通过对函数CWnd::SetStyle的调用可以改变某些窗口风格,但该函 

数不能改变WS_VISABLE,这意味着我们不得不通过调用其基类的成员 

函数ShowWindow来实现:将参数SW_HIDE传给函数以使工具条不可见 

或传递SW_SHOWNORMAL使工具条再次显示。函数SetStyle的原型及参 

数读者不妨自己从系统的帮助文件中查到。  


…………………………………………………………Page 241……………………………………………………………

一旦在程序中改变了工具条,就必须将这一改变通知帧窗口,为此需 

再次计算控制条的位置,这可以通过调用函数 

CFrameWnd::RecalcLayout来实现。该函数为一不带参数的函数,读 

者在程序中可以简单地进行调用即可。例如程序中下列代码  



RecalcLayout( );  



即可将该工具条的变化通知到程序窗口中。  



                                               



                      图5。 20 程序初始画面  



                                               



                     图5。 21 两个工具条并存  



  l 注意:  



  l 限于篇幅原因,本节内容给出一个源程序代码,但较不完整。读 

    者如果感兴趣,可以自己试着编写完全。但需要注意的是,在编 


…………………………………………………………Page 242……………………………………………………………

     辑工具条时,应该将工具条的各个按钮作为位图储存。否则,在 

     程序进行编译时,会出现ID号未定义错。(Undeclared  

     Identifier error)。下面给出程序的一些关键性代码。而且由于 

     前文对各函数讲得较细致;对下面的源代码我们给 出的解释较简 

     单。同时;考虑到只有文件mainframe。cpp中改动较多;下面的源代 

    码仅为该文件。但我们给 出了几幅运行画面(图5。20到图5。22)供比 

     较。  



                                                             



                           图5。 22 隐去自编工具条  



// mainfrm。cpp : 类DMainFrame的实现  



//  



// 。。。  



#include 〃stdafx。h〃  



// 。。。  



//以上为程序包含文件部分。  



IMPLEMENT_DYNCREATE(DMainFrame; CFrameWnd)  



BEGIN_MESSAGE_MAP(DMainFrame; CFrameWnd)  



//{{AFX_MSG_MAP(DMainFrame)  



ON_WM_CREATE()  



ON_MAND(ID_TOOLBAR_CREATE; OnToolbarCreate)  



ON_MAND(ID_TOOLBAR_SHOW; OnToolbarShow)  


…………………………………………………………Page 243……………………………………………………………

ON_UPDATE_MAND_UI(ID_TOOLBAR_CREATE; OnUpdateToolbarCreate)  



ON_UPDATE_MAND_UI(ID_TOOLBAR_SHOW; OnUpdateToolbarShow)  



ON_MAND(ID_EDIT_COPY; OnEditCopy)  



ON_MAND(ID_EDIT_CUT; OnEditCut)  



ON_MAND(ID_EDIT_PASTE; OnEditPaste)  



ON_MAND(ID_EDIT_UNDO; OnEditUndo)  



ON_MAND(ID_FILE_NEW; OnFileNew)  



ON_MAND(ID_FILE_OPEN; OnFileOpen)  



ON_MAND(ID_FILE_SAVE; OnFileSave)  



ON_MAND(ID_FILE_PRINT; OnFilePrint)  



//}}AFX_MSG_MAP  



END_MESSAGE_MAP()  



//以上部分为消息响应;由于要在程序中改变图标选中状态;我们处理了消息 

ON_UPDATE_MAND;  



//该消息在每一个发送该消息之前发送;因此;通过处理该消息;我们就可以在用户看到该图标 

出  



//现以前改变该图标表现。  



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



// arrays of IDs used to initialize control bars  



// toolbar buttons IDs are mand buttons  



static UINT BASED_CODE buttons'' =  



{  



// same order as in the bitmap 'bitmap1。bmp'  



ID_TOOLBAR_CREATE;  



ID_SEPARATOR;  



ID_TOOLBAR_SHOW  



//以上部分为工具条上按钮对应情况;ID_SEPARATOR在两个相邻按钮间加一分隔线  


…………………………………………………………Page 244……………………………………………………………

};  



// toolbar buttons IDs are mand buttons  



static UINT BASED_CODE Toolbar2Buttons'' =  



{  



// same order as in the bitmap 'toolbar。bmp'  



ID_FILE_NEW;  



ID_FILE_OPEN;  



ID_FILE_SAVE;  



ID_SEPARATOR;  



ID_EDIT_CUT;  



ID_EDIT_COPY;  



ID_EDIT_PASTE;  



ID_SEPARATOR;  



ID_FILE_PRINT;  



ID_APP_ABOUT;  



//这一部分同上;注意;工具条按钮间分隔线最好在编程时确定。同时;一定要注意按钮的对应 

情况。  



};  



static UINT BASED_CODE indicators'' =  



{  



ID_SEPARATOR; // status line indicator  



ID_INDICATOR_CAPS;  



ID_INDICATOR_NUM;  



ID_INDICATOR_SCRL;  



//状态条空间分配  



};  



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


…………………………………………………………Page 245……………………………………………………………

// DMainFrame construction/destruction  



DMainFrame::DMainFrame()  



{  



d_pToolbar2 = 0;  



d_bToolbarVisible = FALSE;  



//在此处我们为工具条初始化加入代码;新建工具条初始时不可见  



//以上二变量在文件mainfrm。h中定义:  



//public:  



// CToolBar * d_pToolbar2; // Pointer for dynamic toolbar。  



// BOOL d_bToolbarVisible; // Flag for toolbar visibility。  



}  



DMainFrame::~DMainFrame()  



{  



//mainframe类析构函数  



}  



int DMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)  



{  



if (CFrameWnd::OnCreate(lpCreateStruct) == …1)  



return …1;  



//以下代码创建一工具条  



if (!m_wndToolBar。Create(this) ||  



!m_wndToolBar。LoadBitmap(IDR_MAINFRAME) ||  



!m_wndToolBar。SetButtons(buttons;  



sizeof(buttons)/sizeof(UINT)))  



{  



TRACE0(〃Failed to create toolbarn〃);  


…………………………………………………………Page 246……………………………………………………………

return …1; // fail to create  



}  



//以下代码创建一可移动工具条;如程序不希望如此;可删除下列代码  



m_wndToolBar。EnableDocking(CBRS_ALIGN_ANY);  



EnableDocking(CBRS_ALIGN_ANY);  



DockControlBar(&m_wndToolBar);  



//此下代码使能工具提示;如不需要;可移去  



m_wndToolBar。SetBarStyle(m_wndToolBar。GetBarStyle() |  



CBRS_TOOLTIPS | CBRS_FLYBY);  



//以下代码创建状态条   



if (!m_wndStatusBar。Create(this) ||  



!m_wndStatusBar。SetIndicators(indicators;  



sizeof(indicators)/sizeof(UINT)))  



{  



TRACE0(〃Failed to create status barn〃);  



return …1; // fail to create  



}  



return 0;  



//以上部分为系统对给出的工具条;状态条的初始化;读者不妨对其仔细研究一下。  



}  



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



// DMainFrame diagnostics  



// 。。。  



//其中删节部分调试程序时有用  



// 。。。  



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


…………………………………………………………Page 247……………………………………………………………

// DMainFrame message handlers  



//以下为消息处理函数  



// 菜单项Toolbar|Create消息处理;用于创建工具条  



void DMainFrame::OnToolbarCreate()   



{  



// 仅在工具条不存在时断言成立  



ASSERT(d_pToolbar2 == 0);  



// 创建工具条对象;由于正文中已作较多解释;此处从简  



d_pToolbar2 = new CToolBar();  



d_pToolbar2…》Create(this; WS_CHILD | CBRS_TOP |   



CBRS_TOOLTIPS | CBRS_FLYBY;  



0x9100);  



//获得位图;并与工具条相联系  



d_pToolbar2…》LoadBitmap(IDR_TOOLS);  



d_pToolbar2…》SetButtons(Toolbar2Buttons;   



sizeof(Toolbar2Buttons)/sizeof(UINT));  



//使能工具条移动  



d_pToolbar2…》EnableDocking(CBRS_ALIGN_ANY);  



EnableDocking(CBRS_ALIGN_ANY);  



DockControlBar(d_pToolbar2);  



}  



//……………………………………………………………………………………………………………………………………………………………………………… 



// 选项Toolbar|Show消息处理  



void DMainFrame::OnToolbarShow()   



{  



ASSERT(d_pToolbar2 != 0);  


…………………………………………………………Page 248……………………………………………………………

//查询工具条当前状态  



BOOL bVisible = (d_pToolbar2…》GetStyle() & WS_VISIBLE);  



//显隐切换  



int nShow = (bVisible) ? SW_HIDE : SW_SHOWNORMAL;  



d_pToolbar2…》ShowWindow(nShow);  



//发送工具条变化通知  



RecalcLayout();  



//记录工具条显示状态以留作后用  



d_bToolbarVisible = (!bVisible);  



}  



//……………………………………………………………………………………………………………………………………………………………………………… 



//处理消息 Toolbar|Create ON_MAND_UPDATE_UI;对菜单项 Toolbar|Create作使能检查  



void DMainFrame::OnUpdateToolbarCreate(CCmdUI* pCmdUI)   



{  



pCmdUI…》Enable(d_pToolbar2 == 0);  



}  



//……………………………………………………………………………………………………………………………………………………………………………… 



//处理消息 Toolbar|Show ON_MAND_UPDATE_UI;对菜单项 Toolbar|Create作选择检查  



void DMainFrame::OnUpdateToolbarShow(CCmdUI* pCmdUI)   



{  



pCmdUI…》Enable(d_pToolbar2 != 0);  



int nCheck = (d_bToolbarVisible) ? 1 : 0;  



pCmdUI…》SetCheck(nCheck);  



}  



//……………………………………………………………………………………………………………………………………………………………………………… 



// 消息Edit|Copy选择处理;为了简化程序;对各选项我们的处理是仅仅显示一对话  


…………………………………………………………Page 249……………………………………………………………

//框显示该菜单项已被选择而已  



void DMainFrame::OnEditCopy()   



 {  



AfxMessageBox(_T(〃Edit|Copy mand selected。〃));  



}  



//……………………………………………………………………………………………………………………………………………………………………………… 



// WM_MAND handler for Edit|Cut。  



void DMainFrame::OnEditCut()   



 {  



AfxMessageBox(_T(〃Edit|Cut mand selected。〃));  



}  



//……………………………………………………………………………………………………………………………………………………………………………… 



// WM_MAND handler for Edit|Paste。  



void DMainFrame::OnEditPaste()   



 {  



AfxMessageBox(_T(〃Edit|Paste mand selected。〃));  



}  



//……………………………………………………………………………………………………………………………………………………………………………… 



// WM_MAND handler for Edit|Undo。  



void DMainFrame::OnEditUndo()   



 {  



AfxMessageBox(_T(〃Edit|Undo mand selected。〃));  



}  



//……………………………………………………………………………………………………………………………………………………………………………… 



// WM_MAND handler for File|New。  



void DMainFrame::OnFileNew()   


…………………………………………………………Page 250……………………………………………………………

{  



AfxMessageBox(_T(〃File|New mand selected。〃));  



}  



//……………………………………………………………………………………………………………………………………………………………………………… 



// WM_MAND handler for File|Open。  



void DMainFrame::OnFileOpen()   



{  



AfxMessageBox(_T(〃File|Open。。。 mand selected。〃));  



}  



//……………………………………………………………………………………………………………………………………………………………………………… 



// WM_MAND handler for File|Save。  



void DMainFrame::OnFileSave()   



{  



AfxMessageBox(_T(〃File|Save mand selected。〃));  



}  



//……………………………………………………………………………………………………………………………………………………………………………… 



// WM_MAND handler for File|Save。  



void DMainFrame::OnFilePrint()   



{  



AfxMessageBox(_T(〃File|Print。。。 mand selected。〃));  



}  



                            第三节 快捷键消息响应  



键盘加速键有时也叫键盘捷径;它使用户可用键盘发出命令。Windows  

API提供了加速键表资源;用以保存加速键定义集合。AppWizard生成 

一单文档或多文档应用程序时;提供一个加速键表当通过调用 

CFrameWnd::LoadFrame来初始化一个帧(CFrameWnd)窗口时;则加速键 

表被自动连接到该帧窗口。  


…………………………………………………………Page 251……………………………………………………………

但有几点我们必须提出来说一下。首先;在Microsoft研制Windows 

时,并没有考虑到加速键系统。毕竟在当时看来,Windows所要支持 

的,最主要的应该是鼠标和菜单――毫无疑问,这是当时许多的GUI 

系统 (包括著名的Star   和Apple的Macintosh)得以成功的巨大原 

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