MFC Windows程序设计--工具栏,状态栏,组合栏

来源:互联网 发布:河北工龄工资算法 编辑:程序博客网 时间:2024/06/05 03:32

工具栏

CToolBar,CStatusBar, CReBar
CToolBar<–CToolBarCtrl

工具栏是应用程序主框架窗口的子窗口。
// 默认样式 WS_CHILD | WS_VISIBLE | CBRS_TOP
// 默认ID AFX_IDW_TOOLBAR
m_wndToolBar.Create(this);
新建立的工具栏是空的,下一步是向其添加按钮。
CToolBar::LoadBitmap
CToolBar::SetButton

// RCIDR_TOOLBAR BITMAP Toolbar.bmp// cppstatic 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 可改变图像和按钮尺寸。

// RCIDR_TOOLBAR BITMAP Toolbar.bmpIDR_TOOLBAR TOOLBAR 16, 15BEGIN    BUTTON ID_FILE_NEW    BUTTON ID_FILE_OPEN    BUTTON ID_FILE_SAVE    SEPARATOR    ...END// cppm_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.包含工具提示文本的字符串资源

// RCIDR_TOOLBAR BITMAP Toolbar.bmpIDR_TOOLBAR TOOLBAR 16, 15BEGIN    BUTTON ID_CHAR_BOLD    BUTTON ID_CHAR_ITALIC    BUTTON ID_CHAR_UNDERLINE    SEPARATOR    BUTTON ID_PARA_LEFT    BUTTON ID_PARA_CENTER    BUTTON ID_PARA_RIGHTENDSTRINGTABLEBEGIN    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// cppm_wndToolBar.Create(this, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_TOOLTIPS);m_wndToolBar.LoadToolBar(IDR_TOOLBAR);

如应用程序 既有状态栏又有工具栏,在 工具栏设置 CBRS_FLYBY,可使工具栏显示状态栏 工具说明。

// 在工具栏添加非按钮控件// 1.在TOOLBAR资源中添加一个 按钮分隔符或空白按钮ID_TOOLBAR TOOLBAR 16, 15BEGIN    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 comboboxEND// 2.派生CToolBar,添加成员// CToolBar::SetButtonInfoCMyToolBar::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::SaveBarStateCFrameWnd::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);// RCSTRINGTABLEBEGIN    ID_INDICATOR_INS "INS"END// cppON_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);
0 0
原创粉丝点击