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