友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
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
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!