本文共 3476 字,大约阅读时间需要 11 分钟。
用API创建工具栏,简单例子
之前定义了一个由3个16*16组成的位图,准备创建一个具有三个按钮的工具栏
TBBUTTON tbButtons[]={
{0,100,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0},
{1,200,TBSTATE_ENABLED,TBSTYLE_BUTTON|TBSTATE_WRAP|TBSTATE_ENABLED ,0,0},
{2,300,TBSTATE_ENABLED,TBSTYLE_BUTTON,0,0}
};
CreateToolbarEx(hWnd,WS_CHILD|WS_VISIBLE|TBSTYLE_FLAT,.....,16,16,16,16,sizeof(TBBUTTON));
这样即可:
其中:TBBUTTON结构中的第一元素为:按钮索引,接下来为:按钮的ID,按钮的初始风格等
2、用MFC的CToolBarCtrl类创建
CRect rt;
GetClientRect(&rt);
rt.bottom = rt.top + 24;
m_ctlTB.Create(WS_CHILD|WS_VISIBLET|BSTYLE_FLAT,rt,this,ID_TOOLBAR);
m_ctlTB.AddBitmap(3,IDB_BITMAP1);
m_ctlTB.AddButtons(3,tbButtons);
CToolBarCtrl只是API的简单包装,并没增加功能
3、用MFC的CToolBar类创建
可参考的例子很多,MSDN的例子:MFCIE介绍了如何创建类似IE的具有文字标签和下拉菜单风格的按钮
方法1:
构造CToolBar对象
CToolBar::Create或CToolBar::CreateEx创建工具栏
CToolBar::LoadToolBar加载位图
方法2:
构造CToolBar对象
CToolBar::Create或CToolBar::CreateEx创建工具栏
CToolBar::LoadBitmap加载位图
CToolBar::SetButtons设置按钮ID
两种方法区别在于是否利用toolbar资源
4、为什么工具栏用256以上就会失真
工具栏内部应该以ImageList管理位图,而默认是采用16色。为了使用256以有更高色必须以ILC_COLOR8(256)或相应的值创建ImageList。
然后TB_SETIMAGELIST消息给工具栏设置新的ImageList ,以同样的方法还可以设置工具栏的热点位图。
建议参考MSDN sample的<MfcIe>
5、工具栏的风格:
在MSDN中按《Toolbar Control and Button Styles》索引即可得到所有风格。有些风格对版本有要求,更详细请看MSDN。
TBSTYLE_FLAT: 使工具栏上的按钮表面平坦,按钮边界不会被绘出来,除非鼠标指针在上面
TBSTYLE_LIST: 按钮文本显示在按钮的左边
TBSTYLE_TOOLTIPS:如果用户将鼠标指针停留在按钮上较长时间就使按钮产生TTN_NEEDTEXT通知消息。
程序员负责为这个工具提示提供文本
TBSTYLE_WRAPABLE:使控件将其按钮排成多行以适应当前的控件大小
TBSTYLE_ALTDRAG:允许用户按住ALT来拖动按钮的位置
TBSTYLE_CUSTOMERASE:使控件处理WM_ERASEBKGND 消息时会产生NM_CUSTOMDRAW通知消息
TBSTYLE_TRANSPARENT:除按钮以外工具栏是透明的,文本显示在按钮下面
扩展风格:
TBSTYLE_EX_DRAWDDARROWS :使工具栏能创建具有下拉菜单的按钮
还可以使用以CBRS开头的控制条风格:
CBRS_TOP 控制条在框架窗口的顶部
CBRS_BOTTOM
CBRS_NOALIGN 当框架窗口改变大小时控制条不重置
CBRS_TOOLTIPS 控制条显示TOOPTIP信息
CBRS_SIZE_DYNAMIC
CBRS_SIZE_FIXED
CBRS_FLOATING
CBRS_FLYBY
CBRS_HIDE_INPLACE
还有以CCS开头的通用控件风格:
CCS_NORESIZE: 被创建的控制条的大小由CreateWindow API调用指定。该风格忽略以下4种风格
CCS_TOP: 控制条沿其父窗口框架顶部/底部/左/右对齐并且其宽度设置为系统标准
CCS_BOTTOM:
CCS_LEFT:
CCS_RIGHT:
CCS_NODIVIDER: 控制条自动沿其顶部绘制一条直线:通常用来将工具栏和菜单分隔开
CCS_ADJUSTABLE: 允许用户动态配置工具栏
CCS_NOMOVEY: 下面风格没有明显效果或是重复上面的风格
CCS_NOMOVEEX:
CCS_NOPARENTALIGN:
除此之处还有工具栏按钮的风格和按钮的状态。
2.
窍门: 1、要在工具栏增加一个分割栏,只要拖动某一个按钮稍稍往右移动一点便可以了。 2、要删除一个工具栏按钮,只要点住它,把它拖出工具栏即可。 1、在窗体的右边新建一个工具栏。首先,在ResourceView中的ToolBar右键选择Insert ToolBar新建一个工具栏IDR_TOOLBAR1。画上几个按钮。然后再MainFrame中添加一个成员变量,private CToolBar m_newToolBar; 在Mainframe的OnCreate函数中加入: if (!m_newToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_RIGHT | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_newToolBar.LoadToolBar(IDR_TOOLBAR1)) { TRACE0("Failed to create toolbar/n"); return -1; // fail to create } //创建一个靠在窗体右边的工具栏 m_newToolBar.EnableDocking(CBRS_ALIGN_ANY); //允许工具栏在工具栏区域中移动 EnableDocking(CBRS_ALIGN_ANY); //此框架任何地方允许可拖役,如果已经被别的ToolBar写过可以不用再写 DockControlBar(&m_newToolBar); //允许此工具栏在整个window窗口中拖役 2、现在我们让创建的工具栏和菜单像对应,来隐藏和显示工具栏。首先我们在菜单上新建一栏(IDM_VIEW_NEWTOOL,新的工具栏)。然后我们通过ClassWizard新建一个对此菜单的命令相应函数: 2.1方法一 void CMainFrame::OnViewNewtool() { if (m_newToolBar.IsWindowVisible()) //如果工具栏是显示着,那么就隐藏,否则就显示。 { m_newToolBar.ShowWindow(SW_HIDE); } else { m_newToolBar.ShowWindow(SW_SHOW); } RecalcLayout(); //注意如果不写这行,会出现工具栏隐藏,但工具条仍然存在的现象,需要重新计算 DockControlBar(&m_newToolBar); //这行是为了,在工具栏被拖役出边框时,工具栏窗口不能被隐藏。需要重靠。 } 2.2方法二,将以上函数中的内容改为: ShowControlBar(&m_newToolBar,!m_newToolBar.IsWindowVisible(),FALSE); //一句话便可实现以上功能,并可保存被隐藏前的窗口位置 3、让菜单项的checked标记和ToolBar相关联。我们在菜单项上新建一个UPDATE_COMMAND_UI的消息相应函数: void CMainFrame::OnUpdateViewNewtool(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_newToolBar.IsWindowVisible()); } |
转载地址:http://jouli.baihongyu.com/