MFC中对话框添加工具栏以及去除工具栏上方的横线
2013-02-04 14:00
351 查看
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
方法:在你的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
相关文章推荐
- VS2010 MFC中在对话框上添加工具栏以及工具栏提示信息并改变图标支持256色
- 在基于对话框的MFC中添加工具栏以及工具栏提示信息并改变图标支持256色
- MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息
- MFC基于对话框最小化到托盘,并鼠标右键添加菜单以及对应菜单功能
- MFC 对话框 创建菜单栏、工具栏以及菜单栏Checked 勾选显示工具栏
- qt中添加资源文件以及添加菜单图标、工具栏中菜单的快捷方式、窗口以及对话框的icon
- mfc对话框程序如何添加背景图片以及使控件背景图片与对话框一致
- MFC工具栏设置多彩按钮以及在工具栏添加其他控件
- qt中添加资源文件以及添加菜单图标、工具栏中菜单的快捷方式、窗口以及对话框的icon
- 在基于对话框的MFC创建状态栏以及添加时间显示
- MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息
- MFC对话框程序中添加工具栏及工具栏上的Button响应UPDATE_COMMAND_UI消息
- MFC对话框添加工具栏、菜单、状态栏
- 在MFC对话框界面中添加工具栏,控制条
- MFC——对话框程序添加工具栏按钮图标及其按钮tooltip
- qt中添加资源文件以及添加菜单图标、工具栏中菜单的快捷方式、窗口以及对话框的icon
- MFC 基于对话框的项目如何添加子对话框以及相关知识
- MFC对话框添加工具栏、菜单、状态栏
- MFC 对话框程序如何添加目录,工具栏,状态栏
- 【转】VC 对话框添加工具栏 以及RepositionBar 函数说明