MFC中对话框添加工具栏以及去除工具栏上方的横线

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 
Prevents a two-pixel highlight from being drawn at the top of the control. 看来只要添加这个style就可以了。但实际发现这个风格并没有起到相应作用。 http://topic.csdn.net/u/20070727/11/90cf5757-985d-456b-bc95-50e074a10991.html  给出了答案:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值