C语言实例教程(PDF格式)-第32部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
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)得以成功的巨大原
因。但出于Microsoft对第三方厂家软件的一贯支持,Windows系统中
还是加入了加速键支持部分。在今天看来,Microsoft的这一步,实
际上具有重大的意义,这至少可以从两个方面加以说明:并不能强迫
所有的计算机都以鼠标作为输入手段,也并不是在所有的情形下,鼠
标输入都较键盘输入为快,而且,对一些已经习惯了键盘输入的用户
来说,使用鼠标输入即使只是一个很容易的转变,可毕竟也还是一个
转变,用户需要对此有一个适应的过程。
同时也应该指出的时,Microsoft在
中特别提出,为增强Windows95应用程序的一致性,键盘命令 “不应
该是进行特定操作的唯一方法。”实际上,指南中将加速键称为 “捷
径”多少说明了Microsoft的倾向:它应该也只能是其它命令输入机
制的一种补充而不是替代。它只应该是以鼠标作为主要输入手段的
Windows系统的一种平衡。实际上,我们需要注意的一点就是,我们
所建立的加速键,要么是使用菜单项进行逐项选择较麻烦,或者是我
们在系统中使用频率相当高的部分,同时,加速键要尽量简单,否则
加速键就失去了其本来的意义。遵循这些简单的原则,我们就能