按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
·32 ·
…………………………………………………………Page 42……………………………………………………………
第 2 章 应用程序基本框架
2。5。3 工具栏
工具栏由一系列的按钮和间隔(Seperator )组成。一般功能相关的按钮组成一组,各组
MFC 中使
按钮之间以一定的间隔分开 。通常,工具栏作为主框架窗口中的一个子窗口存在。
用 CToolBar 类来封装工具条控件的各种操作,可以在资源编辑器的 ToolBar 上单击鼠标右键,
选择 Insert ToolBar 项,选中一个工具栏后,鼠标左键双击该工具栏就可以编辑,如图 2…24
所示。
图 2…24 添加一个新的 ToolBar 资源
工具栏上所有按钮的图形在资源中实际上是以一个位图文件存在的。在利用 AppWizard
创建的工程中,自动创建的工具栏位图文件名为 ResToolBar。bmp 。在位图中每个按钮占用一
个宽为 16 像素、高为 15 像素的区域。可以用图形工具条及颜色盒绘制按钮的外表,它的属
性包括 ID、长、宽及鼠标指向它时的说明。一般在 CMainFrame 中定义 CToolBar,其实现在
CMainFrame 的 OnCreate 函数中完成,在该函数中用于创建工具栏的具体特征。
在工具栏中嵌入编辑框等控件,可以通过下面的方法:
o 定义一个编辑控件对象,不能是局部变量,否则会被释放掉;
o 调用 Create,惟一注意的是要在工具条中调用。
CRect rect;
m_wndToolBar。GetItemRect(1;&rect);
edit。Create(WS_CHILD|WS_VISIBLE;rect;&m_wndToolBar;ID_EDIT);
实例 2…6 :添加工具栏程序。源代码在光盘中“02实例 2…6MyToolBar ”目录下。
下面是一个 MyToolbar 的示例程序,集中演示了 ToolBar 在框架窗口中的应用。新建一
个空的 Win32 Application 工程,然后加入下面的 MyToolBar。cpp 源文件,按照前面给出的步
骤加入新的工具栏资源,这里工具栏的 ID 设置为 IDR_MYTOOL1 ,其属性如图 2…25 所示。
·33 ·
…………………………………………………………Page 43……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
图 2…25 工具栏属性对话框
#include
#include
#include 〃resource。h〃
class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CMyWnd:public CFrameWnd
{
public:
~CMyWnd();
CToolBar MyToolBar;
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnButton10();
afx_msg void OnButton11();
afx_msg void OnButton12();
afx_msg void OnButton13();
DECLARE_MESSAGE_MAP()
};
CMyApp MyApp;
BEGIN_MESSAGE_MAP(CMyWnd;CFrameWnd)
ON_WM_CREATE()
ON_MAND(ID_BUTTON40010;OnButton10)
ON_MAND(ID_BUTTON40011;OnButton11)
ON_MAND(ID_BUTTON40012;OnButton12)
ON_MAND(ID_BUTTON40013;OnButton13)
END_MESSAGE_MAP()
BOOL CMyApp::InitInstance()
{
CMyWnd* pCWindow=new CMyWnd;
pCWindow…》LoadFrame(IDR_MYTOOLBAR1);//创建主窗口,加载菜单
m_pMainWnd = pCWindow;
·34 ·
…………………………………………………………Page 44……………………………………………………………
第 2 章 应用程序基本框架
pCWindow…》ShowWindow(m_nCmdShow);
pCWindow…》UpdateWindow();
return TRUE;
}
int CMyWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CFrameWnd::OnCreate(lpCreateStruct);
SetWindowText(〃ToolBar〃);
MyToolBar。CreateEx(this; TBSTYLE_FLAT;
WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER);
MyToolBar。LoadToolBar(IDR_MYTOOL1);
MyToolBar。EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&MyToolBar);
return 0;
}
CMyWnd::~CMyWnd()
{
}
void CMyWnd::OnButton10()
{
AfxMessageBox(〃Click button 10〃);
}
void CMyWnd::OnButton11()
{
AfxMessageBox(〃Click button 11〃);
}
void CMyWnd::OnButton12()
{
AfxMessageBox(〃Click button 12〃);
}
void CMyWnd::OnButton13()
{
AfxMessageBox(〃Click button 13〃);
}
程序运行结果如图 2…26 所示。
·35 ·
…………………………………………………………Page 45……………………………………………………………
Visual C++ 6。0 程序设计从入门到精通
图 2…26 MyToolbar 示例程序运行结果
2。5。4 状态栏
利用 AppWizard 自动创建的工程文件中,一般都自动添加了状态栏,在编程过程中,只
要在原有状态栏的基础上进行修改就可以了。
状态栏实际上是个窗口,一般分为几个窗格,每个窗格显示不同的信息。AppWizard 会
为应用程序自动创建一个默认的状态栏,该状态栏包括几个窗格,分别用来显示状态栏提示、
大小写锁定键(CAPS LOCK )、数字锁定键(NUM LOCK )和滚动锁定键(SCROLL LOCK)
的状态。在 MFC 中,状态栏的功能由 CStatusBar 类实现,创建一个状态栏需要以下几个步
骤:
o 构建一个 CStatusBar 对象;
o 调用 CStatusBar::Create 创建状态栏窗口;
o 调用 CStatusBar::SetIndicators 函数分配窗格,并将状态栏的每一个窗格与一个字符串
ID 相联系。
if (!m_wndStatusBar。Create(this) ||
!m_wndStatusBar。SetIndicators(indicators; sizeof(indicators)/sizeof(UINT)))
{
TRACE0(〃Failed to create status barn〃);
return …1; // fail to create
}
实例 2…7 :电子时钟。源代码在光盘中“02实例 2…7EClock ”目录下。
下面将通过一个电子时钟(在状态栏中嵌入一个电子时钟 )的例程来向读者详细讲述工
具栏的使用。
首先在 indicators 数组的 ID_SEPARATOR 项之后插入一个名为 ID_INDICATOR_CLOCK
的 ID,然后找到并双击字符串资源,打开字符串资源编辑窗口,接着在编辑窗口内按 Insert
键以插入一个新的字符串,指定字符串的 ID 为 ID_INDICATOR_CLOCK,内容为 00:00:00 。
由于状态栏将根据字符串的长度来确定相应窗格的默认宽度,所以指定为 00:00:00 就为时间
的显示预留了空间。添加该字符串资源的结果如图 2…27 所示。
·36 ·
…………………………………………………………Page 46……………………………………………………………
第 2 章 应用程序基本框架
时间窗格显示的时间必须每隔一秒钟更新一次。更新时间窗格的正文可调用 CStatusBar::
SetPaneText 函数,要定时更新,则应利用定时器消息(WM_TIMER )。在 Windows 中用户可
以安装一个或多个计时器,计时器每隔一定的时间间隔就会自动发出一个 WM_TIMER 消息,
而这个时间间隔可由用户指定。MFC 的 Window 类提供了 WM_TIMER 消息处理函数
OnTimer,可以在该函数内进行更新时间窗格的工作。
图 2…27 添加 ID_INDICATOR_CLOCK 字符串资源的结果
可以利用 ClassWizard 工具给 CMainFrame 类加入 WM_TIMER 的消息处理函数 OnTimer
和 WM_CLOSE 消息的处理函数 OnClose 。具体方法是在 Class name 栏中选择 CMainFrame,
在 Object IDs 栏中选择 CMainFram