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

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

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





//使能工具条移动  



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)得以成功的巨大原 

因。但出于Microsoft对第三方厂家软件的一贯支持,Windows系统中 

还是加入了加速键支持部分。在今天看来,Microsoft的这一步,实 

际上具有重大的意义,这至少可以从两个方面加以说明:并不能强迫 

所有的计算机都以鼠标作为输入手段,也并不是在所有的情形下,鼠 

标输入都较键盘输入为快,而且,对一些已经习惯了键盘输入的用户 

来说,使用鼠标输入即使只是一个很容易的转变,可毕竟也还是一个 

转变,用户需要对此有一个适应的过程。  



同时也应该指出的时,Microsoft在 

中特别提出,为增强Windows95应用程序的一致性,键盘命令 “不应 

该是进行特定操作的唯一方法。”实际上,指南中将加速键称为 “捷 

径”多少说明了Microsoft的倾向:它应该也只能是其它命令输入机 

制的一种补充而不是替代。它只应该是以鼠标作为主要输入手段的 

Windows系统的一种平衡。实际上,我们需要注意的一点就是,我们 

所建立的加速键,要么是使用菜单项进行逐项选择较麻烦,或者是我 

们在系统中使用频率相当高的部分,同时,加速键要尽量简单,否则 

加速键就失去了其本来的意义。遵循这些简单的原则,我们就能开发 

出用户界面简捷的应用程序。  



在本节中,为了理解的清晰,我们将首先简单的介绍一下键盘输入的 

处理,然后,我们将进行加速键的处理的介绍。我们将尽量介绍清楚 

键的使用规则及其运行机制,最后,作为一个小小的补充,我们将介 

绍如何动态地安装一个加速键表。  



下面,我们首先简单地介绍一下键盘输入。  



在中介绍了四种键盘输入:正文 

键,访问键,模式键以及快捷键。正文键指的是可打印字符:大小写 

字母,数字,标点符号及其它符号。用户期望用字符和数字键来产生 

可打印的字符和数字。而访问键 (记忆键)则我们在菜单中经常提到 

的与Alt键一起组合按下时,可以访问弹出式菜单项或对话框控制。 

由于可能与加速键间产生冲突,我们一般应避免将加速键定义为Alt 

键加上一个字母或数字键。模式键指的是封锁键与修改键。它们改变 

其它键或输入设备的动作。从IBM   PC机继承下来的标准Windows兼容 

键盘有三个封锁键:Caps Lock;Num Lock  和Scroll Lock。而修改键 

Shift;Ctrl和Alt使可用于定义的加速键成数倍的增长。任何在其它 

几类中定义的键都可以作为快捷键 (包括功能键F1至F12,光标移动 


…………………………………………………………Page 252……………………………………………………………

键Home;向上箭头,向下箭头等)。用这些  键与修改键结合,就能够 

产生许多加速键。当然,我想,使用104键键盘的用户一定也会注意 

到键盘上的Windows键及Application键,其中Windows键为一附加的 

修改键,为操作系统保留,而Application键则在程序中用于引导出 

上下文菜单。  



接下来我们看一看定义加速键的方法。这包含两个步骤。  



首先,我们需要创建一个加速键资源。  



                                   



                图5。 23 加速键表编辑器  



图5。23为系统显示的编辑加速键表时的特性对话框。其本身包含三 

列:ID,键以及类型。命令ID标识了当用户按下一个加速键时通过 

WM_MAND消息所传送的命令码。我们已经知道,系统调用消息映射 

进行识别是通过消息的ID号辨识的,因此,如果两条消息的ID号相 

同,它们所调用的消息处理函数就是相同的。形象一些地说,如果我 

们的程序中有菜单项与加速键所对应的ID号均为ID_TITLE_HELLO,那 

么,该加速键与该菜单项所完成的动作就是一样的。键域则标识了加 

速键所对应的键盘键。对于数字键或字母键,只需要简单的键入即 

可,而对于非打印字符,则需要使用虚拟码。当然,我们觉  



得在弄不清楚虚拟键的具体使用时,一个最省属的办法还是单击Next  

Key   Typed,然后直接指定我们所需要的键 (此时系统会 自动帮助我 

们采集消息并填入个域中)。如果不是使用上面的方法,我们所还需 

要做的最后一件事就是填写修改键域。按照Windows的建议,我们应 

首先考虑使用Ctrl键,然后再使用其它键。虽然使用Type域中ASCII 

选项以便区分所指定的键的大小写是可能的,然而,绝大多数的用户 

会对如此严格要求的键厌烦的,进一步的后果当然就是放弃该程序。 

所以,使用VirtKey几乎总是合适的选择。  


…………………………………………………………Page 253……………………………………………………………

                                     



                 图5。 24 加速键提示设计  



绝大多数时候我们需要为加速键创建一个菜单提示。这一步在前面的 

菜单设计中我们实际上已经遇到过,我们一般是在具有加速键的菜单 

项右侧显示的。如图5。24中,在Caption域中,  



Say &HellotCtrl+H  



的前一部分指示菜单项, “t”后面的部分则指定了该菜单项的加速 

键是Ctrl+H。  



  l 注意  



  l 初学者往往认为在菜单项中作上述设定以后就同时指定了相应的 

   加速键,而不用加速键编辑器进行指定。那么,菜单项中所指定 

   的加速键实际上是不开用的。  



      对没有相应的菜单项与之相对应的加速键,我们应通过一些 

      途径 (例如放在帮助文件中)告诉用户。(除非你本来就没 

      打算让用户知道。)  



  l 我们还需要再重新提一下加速键定义的原则 (参考):  



      尽可能指派用户容易操作的单键  



      使得修改-字母-键组合不是特别敏感 (避免混乱)。  



      对不使用Shift键的键或键组合动作的扩展和补充动作最好使 

      用Shift键组合。例如,如果使用Alt+Tab从上到下选择控件 

      焦点,那么使用Shift+Alt+Tab键组合就是一个很不错的安 

      排。  



      对作用范 围较大的动作用Ctrl键组合。例如,在大家熟悉的 

      记事本中,使用Home来移动到客户编辑区的光标所在行开始 


…………………………………………………………Page 254……………………………………………………………

处,而使用Ctrl+Home键从编辑区的任一位置移动到文本的开 

始处。  



避免使用Alt键组合,因为它容易与标准的键盘对菜单和控制 

的访问项冲突。另外,一些Alt的组合键已经留给Windows 系 

统调用。  



尽量指定用户熟悉的组合键。对Windows程序中,几乎很少有 

程序指定除Ctrl+C别的键来作为 “复制”命令的加速键-虽 

然并不是不可以这样。  



应在可能的情况下让用户能够修改程序中的快捷键。(利用 

热键控件几乎总是一个可行的选择。)  



通常总是使用Esc键来终止一个正在处理的功能或操作。  



作为参考,我们给出一部分Microsoft Windows所使用的标准 

键盘命令于表5。3中。  



        表5。 3 Windows系统所使用的标准键盘命令  



    范 畴     键 入       描 述  



            Ctrl+Alt+Del  Windows95/NT注册/注销  



            Alt+Tab   选择下一应用程序  



            Alt+Esc   选择下一活动的应用程序  



            Ctrl+Esc  显示Windows95开始菜单  



            Alt+Space  打开Windows95系统菜单  

    系统命令  

            PrtScr    屏幕快照至剪贴板  



            Alt+PrtScr  当前活动快照至剪贴板  



            Alt       激活/撤消应用程序菜单条  



                      封锁DOS for Windows全屏 

            Alt+Enter  

                      正文模式  



            Esc       取消当前模式或操作  



            Enter     对话框中缺省项选择  



            Tab       对话框中选择下一控制  


…………………………………………………………Page 255……………………………………………………………

                                       关闭当前活动的最顶一层 

                        Alt+F4  

                                       窗口  



                                       显示一上下文菜单 (104键 

                        Application键  

                                      盘中)  

              应用程序 

              模式  

                         Shift+F10     显示一上下文菜单  



                        F1            调用系统帮助  



                         Shift+F1     调用上下文帮助  



                         Ctrl+N       File|New  



                         Ctrl+O       File|Open  

              文件命令  

                         Ctrl+P       File|Print  



                         Ctrl+S       File|Save  



                         Ctrl+Z       Edit|Undo  



              剪贴板命                    Edit|Undo(向Windows3。x 

                        Alt+BackSpace  

              令                        兼容)  



                         Ctrl+X       Edit|Cut  



                                                                    续表5。3 



                                      Edit|Cut(向Windows3。x兼 

                         Shift+Del  

                                       容)  



                         Ctrl+C       Edit|Copy  



              剪贴板命                    Edit|Copy(向Windows3。x 

                         Ctrl+Ins  

              令                        兼容)  



                         Ctrl+V       Edit|Paste  



                                      Edit|Paste(向Windows3。x 

                         Shift+Ins  

                                       兼容)  



                         Ctrl+F4       关闭当前活动文档窗口  



              MDI命令      Ctrl+F6      激活下一文档窗口  



                                                       

                         Shift+Ctrl+F6  激活前一文档窗口 



在本节的最后,我们简单的谈一下多重加速键表的问题。在所有加速 

键函数中,  Win32  API只有六个加速键函数。(MFC中没有封装加速 


…………………………………………………………Page 256……………………………………………………………

键函数就是因为原因的加速键函数太少)。其中函数 

LoadAccelerator用于从加速键资源中创建一个常驻RAM的加速键表, 

而函数TranslateAccelerator测试一个特定的键盘消息是否与一个加 

速键表命令入口相对应。限于篇幅的原因,在这里我们仅仅简单的作 

一介绍,更详细的信息可以从Visual  C++的帮助文件中获得。顺便说 

一下,可以调用函数PreCreateWindow来在窗口显示以前装入一个加 

速键表装入内存。此后我们可以用对函数PreTranslateMessage的调 

用保证加速键表在适当的时候被调用。例如:  



BOOL DWindowingClass::PreTranslateMessage(MSG *pMsg)  



{  



if(d_hAccel==NULL)  



return FALSE;//我们不处理  



return ::TranslateAccelertor(m_hWnd;d_hAccel;pMsg);  



}  



作为对本章中键盘消息响应的结束,我们给出一个有趣的例程,读者 

不妨运行之,看看是否很有意思。  



// echofill。h : main header file for the ECHOFILL application  



//  



#ifndef __AFXWIN_H__  



#error include 'stdafx。h' before including this file for PCH  



#endif  



#include 〃resource。h〃 // main symbols  



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



// DApp:  



// See echofill。cpp for the implementation of this class  



//  



class DApp : public CWinApp  



{  



public:  


…………………………………………………………Page 257……………………………………………………………

DApp();  



// Overrides  



// ClassWizard generated virtual function overrides  



//{{AFX_VIRTUAL(DApp)  



public:  



virtual BOOL InitInstance();  



//}}AFX_VIRTUAL  



// Implementation  



//{{AFX_MSG(DApp)  



afx_msg void OnAppAbout();  



// NOTE the ClassWizard will add and remove member functions here。  



// DO NOT EDIT what you see in these blocks of generated code !  



//}}AFX_MSG  



DECLARE_MESSAGE_MAP()  



};  



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



//{{NO_DEPENDENCIES}}  



// Microsoft Visual C++ generated include file。  



// Used by ECHOFILL。RC  



//  



#define IDR_MAINFRAME 128  



#define IDD_ABOUTBOX 100  



// Next default values for new objects  



//   



#ifdef APSTUDIO_INVOKED  



#ifndef APSTUDIO_READONLY_SYMBOLS  


…………………………………………………………Page 258……………………………………………………………

#define _APS_3D_CONTROLS 1  



#define _APS_NEXT_RESOURCE_VALUE 130  



#define _APS_NEXT_CONTROL_VALUE 1000  



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