1. 在dialog上显示工具栏
方法:在你的Dialog类中添加成员变量CToolBar m_toolbar,然后在OnInitDialog中创建toolbar:
if(!m_toolbar.Create(this) || !m_toolbar.LoadToolBar(IDR_xxx))
...
如果想让其显示在某个特定位置,可以先在目标位置创建一个dummy控件(比如一个button),然后讲toolbar move到那个地方。
比如下图中的"dummy for toolbar"按钮。以下代码完成该任务:
CRect rtToolBar;
this->GetDlgItem(IDC_xxx)->GetWindowRect(&rtToolBar);
this->GetDlgItem(IDC_xxx)->ShowWindow(SW_HIDE);
CPoint ptStart = rtToolBar.TopLeft();
this->ScreenToClient(&ptStart);
m_toolbar.MoveWindow(ptStart.x, ptStart.y, rtToolBar.Width(), rtToolBar.Height());
注意一定要隐藏dummy控件,不然toolbar是不会显示的。
效果如下:
2. 去掉toolbar上的横线
toolbar上的那道横线很不协调,如何去掉呢?
MSDN中有以下内容:
CCS_NODIVIDER
m_toolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE |CBRS_ALIGN_TOP)
就可以了。或者
m_toolbar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE |CBRS_ALIGN_TOP|CCS_NODIVIDER) 。
效果如下:
以后就可以用toolbar代替button了。
后记:
3. CToolBar不能使用真彩色的图片,而CMFCToolBar可以。但使用CMFCToolBar代替CToolBar却出现了以下问题:
上面的横线没有了,但下面又多出来一条线。我重载了CMFCToolBar的DoPaint,按钮全没了,但下面的线还在。Debug发现这是CMFCToolBar的non-client区域,它是由CMFCToolBar::OnNcPaint绘制的。所以要去掉下面的线需要扩展CMFCToolBar类,然后响应WM_NCCALCSIZE和WM_NCPAINT消息,什么都不做即可。效果如下:
另外,最好重设CMFCToolBar的右键菜单,设为空即可。CMFCToolBar的border默认是1(CToolBar为0),最好也改为0。
最后,toolbar的消息默认是通过主框架路由的,而这里我们希望由dialog处理,而不是main frame。这可以通过以下函数实现:
CMFCToolBar::SetRouteCommandsViaFrame
参数设为false即可。
另:函数hook:http://www.cppblog.com/meet-dream/archive/2007/03/05/19265.html
原文链接:http://hi.baidu.com/wpzhao/item/ceb9d2d336bd69ba32db908e