工具栏
CToolBar,CStatusBar, CReBar
CToolBar<–CToolBarCtrl
工具栏是应用程序主框架窗口的子窗口。
// 默认样式 WS_CHILD | WS_VISIBLE | CBRS_TOP
// 默认ID AFX_IDW_TOOLBAR
m_wndToolBar.Create(this);
新建立的工具栏是空的,下一步是向其添加按钮。
CToolBar::LoadBitmap
CToolBar::SetButton
// RC
IDR_TOOLBAR BITMAP Toolbar.bmp
// cpp
static UINT bButtonIDs[] =
{
ID_FILE_NEW,
ID_FILE_OPEN,
ID_FILE_SAVE,
ID_FILE_SEPARATOR,
...
};
m_wndToolBar.Create(this);
m_wndToolBar.LoadBitmap(IDR_TOOLBAR);
m_wndToolBar.SetButtons(nButtonIDs, 10);
CToolBar::SetSize 可改变图像和按钮尺寸。
// RC
IDR_TOOLBAR BITMAP Toolbar.bmp
IDR_TOOLBAR TOOLBAR 16, 15
BEGIN
BUTTON ID_FILE_NEW
BUTTON ID_FILE_OPEN
BUTTON ID_FILE_SAVE
SEPARATOR
...
END
// cpp
m_wndToolBar.Create(this);
m_wndToolBar.LoadToolBar(IDR_TOOLBAR);
// 可以在按钮表面除图形外,添加文字描述
m_wndToolBar.SetButtonText(0, _T("New"));
...
// 在调用了SetButtonText后,必须调用。
// 用来指定按钮尺寸 和 图形尺寸。
m_wndToolBar.SetSize(CSize(48, 42), CSize(40, 19));
// 设置按钮风格
m_wndToolBar.SetButtonStyle(0, TBBS_CHECKBOX);
...
// 给 工具栏添加单选按钮时,应在每组中选中一个成员作为默认
int nState = m_wndToolBar.GetToolBarCtrl().GetState(ID_PARA_LEFT);
m_wndToolBar.GetToolBarCtrl().SetState(ID_PARA_LEFT, nState | TBSTATE_CHECKED);
固定和浮动式工具栏
CControlBar::EnableDocking
CFrameWnd::EnableDocking
位标志。
CBRS_ALIGN_LEFT 允许放在框架窗口左侧
CBRS_ALIGN_RIGHT 右
CBRS_ALIGN_TOP 顶
CBRS_ALIGN_BOTTOM 底
CBRS_ALIGN_ANY
m_wndToolBar.EnableDocking(CBRS_ALIGN_TOP | CBRS_ALIGN_BOTTOM);
EnableDocking(CBRS_ALIGN_ANY);
CFrameWnd::DockControlBar
CFrameWnd::FloatControlBar
CControlBar::IsFloating
CToolBar::SetWindowText
工具栏样式:
CBRS_SIZE_DYNAMIC
CBRS_SIZE_FIXED
TBBS_WRAPPED
m_wndToolBar.Create(this);
m_wndToolBar.LoadToolBar(IDR_TOOLBAR);
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() | CBRS_SIZE_FIXED);
m_wndToolBar.SetButtonStyle(2, m_wndToolBar.GetButtonStyle(0) | TBBS_WRAPPED);
m_wndToolBar.SetButtonStyle(5, m_wndTool.GetButtonStyle(0) | TBBS_WRAPPED);
EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(0);
FloatControlBar(&m_wndToolBar, CPoint(x, y));
工具栏可见性:
CFrameWnd::OnBarCheck // 切换 工具栏/状态栏 显示/隐藏状态
CFrameWnd::OnUpdateControlBarMenu
ON_COMMAND_EX 可接受UINT参数,来传递ID。
CFrameWnd::ShowControlBar
菜单项目更新:主框架响应WM_INITMENUPOPUP
工具栏更新:应用程序无消息处理时。
不必改变按钮样式,利用更新处理程序就可以让工具栏按钮成为 复选/单选。
添加工具栏提示和状态栏工具说明:
光标在工具栏按钮上停一会,屏幕上出现提示窗口。
要求
1.工具栏样式有:CBRS_TOOLTIPS
2.包含工具提示文本的字符串资源
// RC
IDR_TOOLBAR BITMAP Toolbar.bmp
IDR_TOOLBAR TOOLBAR 16, 15
BEGIN
BUTTON ID_CHAR_BOLD
BUTTON ID_CHAR_ITALIC
BUTTON ID_CHAR_UNDERLINE
SEPARATOR
BUTTON ID_PARA_LEFT
BUTTON ID_PARA_CENTER
BUTTON ID_PARA_RIGHT
END
STRINGTABLE
BEGIN
ID_CHAR_BOLD "\nBold"
ID_CHAR_ITALIC "\nItalic"
ID_CHAR_UNDERLINE "\nUnderLine"
ID_PARA_LEFT "\nAlign Left"
ID_PARA_CENTER "\nAlign Center"
ID_PARA_RIGHT "\nAlign Right"
END
// cpp
m_wndToolBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS);
m_wndToolBar.LoadToolBar(IDR_TOOLBAR);
如应用程序 既有状态栏又有工具栏,在 工具栏设置 CBRS_FLYBY,可使工具栏显示状态栏 工具说明。
// 在工具栏添加非按钮控件
// 1.在TOOLBAR资源中添加一个 按钮分隔符或空白按钮
ID_TOOLBAR TOOLBAR 16, 15
BEGIN
BUTTON ID_CHAR_BOLD
BUTTON ID_CHAR_ITALIC
BUTTON ID_CHAR_UNDERLINE
SEPARATOR
BUTTON ID_PARA_LEFT
BUTTON ID_PARA_CENTER
BUTTON ID_PARA_RIGHT
SEPARATOR // space between button and combobox
SEPARATOR // placeholder for combobox
END
// 2.派生CToolBar,添加成员
// CToolBar::SetButtonInfo
CMyToolBar::OnCreate(...)
{
...
SetButtonInfo(8, IDC_COMBOBOX, TBBS_SEPARATOR, nWidth);
CRect rect;
GetItemRect(8, rect);
rect.bottom = rect.top + nHeight;
m_wndComboBox.Create(WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_SORT | CBS_DROPDOWNLIST, rect, this, IDC_COMBOBOX);
}
// 组合框隶属于工具栏,工具栏移动时,其也移动。
// 工具栏接收组合框WM_COMMAND。
// 更新非按钮控件
void CMyToolBar::OnUpdateCmdUI(CFrameWnd *pTarget, BOOL bDisableIfNoHandler)
{
CToolBar::OnUpdateCmdUI(pTarget, bDisableIfNoHandler);
CString string = GetTypefaceAtCaret();
if(m_wndComboBox.SelectString(-1, string) == CB_ERR)
{
m_wndComboBox.SetCurSel(-1);
}
}
使工具栏设置永久化
// 将工具栏的 停放位置,浮动状态,等信息写入磁盘
CFrameWnd::SaveBarState
CFrameWnd::LoadBarState
CWinApp::SetRegistryKey // 使注册表可用
应用程序正常关闭,会进 CFrameWnd::OnClose
应用程序运行时,Windows关闭,会进OnEndSession
窗口清除顺序:
弹出式窗口–>框架窗口–>框架窗口子窗口
状态栏
CStatusBar
创建,初始化状态栏
在资源文件以字符串资源形式提供帮助文本。
状态栏可以划为为多个区域。
创建,初始化状态栏:
// 样式和ID采用默认值
m_wndStatusBar.Create(this);
// CStatusBar::SetIndicators 将状态栏初始化
UINT nIndicator = ID_SEPARATOR;
m_wndStatusBar.Create(this);
m_wndStatusBar.SetIndicators(&nIndicator, 1);
// RC
STRINGTABLE
BEGIN
ID_INDICATOR_INS "INS"
END
// cpp
ON_UPDATE_COMMAND_UI(ID_INDICATOR_INS, OnUpdateIndicator)
CMainFrame::OnCreate(...)
{
static UINT nIndicators[] =
{
ID_SEPARATOR,
ID_INDICATOR_INS,
};
m_wndStatusBar.Create(this);
m_wndStatusBar.SetIndicators(nIndicators, 2);
}
void CMainFrame::OnUpdateIndicators(...)
{
pCmdUI->Enable(m_bInsert);
}
当状态栏第一个窗格ID为ID_SEPARATOR时,启用一个功能。
:用户加亮显示某菜单项时,主框架会查看并确定应用程序的EXE文件是否包含ID值为菜单项ID的字符串资源。如找到,则加载字符串资源,并把它显示在状态栏窗格中。
创建自定义状态栏窗格
CStatusBar::SetPaneInfo(1, 2, 3, 4)
1,窗格索引
2.窗格ID
3.窗格样式
4.窗格宽
样式:
SBPS_NOBORDERS
SBPS_POPOUT
SBPS_NORMAL
SBPS_DISABLED
SBPS_STRETCH
SBPS_OWNERDRAW
static UINT nIndicators[] =
{
ID_SEPARATOR,
ID_SEPARATOR,
ID_SEPARATOR
};
m_wndStatusBar.Create(this);
m_wndStatusBar.SetIndicators(nIndicators, 3);
m_wndStatusBar.SetPaneInfo(0, ID_SEPARATOR, SBPS_NOBORDERS, 64);
...
设置窗格文本:
1.CStatusBar::SetPaneText。
2.给窗格映射一个更新函数,此函数调用CCmdUI::SetText设定文本。
写往状态栏文本前加一个’\t’,可以居中。加两个’\t’,可以右对齐。
组合栏
CReBar
CReBarCtrl
CReBar:
Create
GetReBarCtrl
AddBar
// 1
m_wndToolBar.CreateEx(this);
m_wndToolBar.LoadToolBar(IDR_TOOLBAR);
m_wndReBar.Create(this);
m_wndReBar.AddBar(&m_wndToolBar);
// 2
m_bitmap.LoadBitmap(IDB_BKGND);
m_wndToolBar.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT);
m_wndToolBar.LoadToolBar(IDR_TOOLBAR);
m_wndReBar.Create(this);
m_wndReBar.AddBar(&m_wndToolBar, _T("Main"), &m_bitmap);