CDialog上使用CToolBar+CReBar

时间:2023-02-10 16:50:22

最经在做一些用户界面的东西,对话框上有很多按钮和组合框,全部加起来差不多有20多个吧,界面非常凌乱,最后决定用CToolBar + CReBar来重新设计界面,为什么选用这个呢?一是因为看到IE用的也是这个,二是用CReBar+透明的CToolBar可以实现漂亮的换肤效果。

1、在对话框类中添加成员变量:

CStatic m_static;
CButton m_btn;
CComboBox m_combo;
CToolBar m_toolBar;
CReBar m_reBar;

在OnInitDialog()添加如下代码:

1、用于创建工具栏和ReBar

if (!m_reBar.Create(this))
return FALSE; if (!m_toolBar.CreateEx(this))
return FALSE; //TBSTYLE_TRANSPARENT是使CToolBar透明,可以显示CReBar的背景。
//TBSTYLE_LIST用于设置按钮文字时,文字在按钮的右边,默认情况下是文字在按钮的下部
m_toolBar.ModifyStyle(0, TBSTYLE_TRANSPARENT | TBSTYLE_LIST); m_toolBar.GetToolBarCtrl().SetExtendedStyle(TBSTYLE_EX_DRAWDDARROWS);//设置下拉箭头样式 m_toolBar.SetButtons(NULL, 5);//设置ToolBar 按钮个数
m_reBar.AddBar(&m_toolBar);

2、添加按钮:

CRect rect;
int nIndex = -1; //添加文本
m_toolBar.SetButtonInfo(++nIndex, 0, TBSTYLE_BUTTON | BTNS_AUTOSIZE | TBSTYLE_AUTOSIZE | TBBS_DISABLED, -1);
//此处是为了增加按钮的宽度,可以更加自己的需要适当的调整,由于是不可见字符,因此是透明的
m_toolBar.SetButtonText(nIndex, _T(" "));
m_toolBar.GetItemRect(nIndex, &rect);
rect.top += 3;//此处是为了让文本垂直居中
m_static.Create(_T("工具栏"), WS_CHILD | WS_VISIBLE | SS_CENTER | SS_SIMPLE, rect, &m_toolBar);
m_static.SetFont(m_toolBar.GetFont()); //添加组合框
m_toolBar.SetButtonInfo(++nIndex, 0, TBSTYLE_SEP, 80);
m_toolBar.GetItemRect(nIndex, &rect);
rect.bottom += 100;
m_combo.Create(WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, rect, &m_toolBar, 0);m_combo.SetFont(m_toolBar.GetFont()); //添加
CheckBoxm_toolBar.SetButtonInfo(++nIndex, 0,TBSTYLE_BUTTON | TBBS_DISABLED | TBSTYLE_AUTOSIZE, -1);
m_toolBar.SetButtonText(nIndex, _T(" "));
m_toolBar.GetItemRect(nIndex, &rect);
m_btn.Create(_T("你好"), WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, rect, &m_toolBar, 0);
m_btn.SetFont(m_toolBar.GetFont());
//添加下拉按钮,这个-2表示不显示按钮位图,但是显示了文字,这个我通过跟踪IE8的CToolBar按钮得到的,微软完全没有说明。
//至于这个-2是怎么来的,我会在另一个文章中说明。
m_toolBar.SetButtonInfo(++nIndex, 0, TBSTYLE_AUTOSIZE | BTNS_WHOLEDROPDOWN, -2);
m_toolBar.SetButtonText(nIndex, _T("下拉列表")); //显示ReBar和工具栏
CRect rcWnd;
GetClientRect(&rcWnd);
m_reBar.SetWindowPos(NULL, 0, 0, rcWnd.Width(), 24, SWP_SHOWWINDOW);//显示CReBar

显示效果如下:

CDialog上使用CToolBar+CReBar

"工具栏"是CStatic,如果要让他透明,直接从CStatic 派生一个CStaticExt类

添加宏ON_WM_CTLCOLOR_REFLECT()和函数

HBRUSH CTransparentStatic::CtlColor(CDC *pDC, UINT nCtlColor)
{
pDC->SetBkMode(TRANSPARENT);
return (HBRUSH)::GetStockObject(NULL_BRUSH);//直接返回空画刷,这样就透明了
}

4、让对话框能响应ON_UPDATE_COMMAND_UI消息

添加函数:

void OnKickIdle()
{
if (m_toolBar.GetSafeHwnd() && m_toolBar.IsWindowVisibile())
m_topBar.OnUpdateCmdUI((CFrameWnd *)this, FALSE);//响应工具栏按钮更新消息
}

添加宏ON_WM_INITMENUPOPUP()和函数:

void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
CDialogEx::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
if (!bSysMenu && pPopupMenu)
{
CCmdUI cmdUI;
int nCount;
UINT nID; cmdUI.m_pOther = NULL;
cmdUI.m_pMenu = pPopupMenu;
cmdUI.m_pSubMenu = NULL; nCount = pPopupMenu->GetMenuItemCount();
cmdUI.m_nIndexMax = nCount; for (int i = 0; i < nCount; ++i)
{
nID = pPopupMenu->GetMenuItemID(i);
if (nID == -1 || nID == 0)
continue; cmdUI.m_nID = nID;
cmdUI.m_nIndex = i;
cmdUI.DoUpdate(this, FALSE);//菜单按钮更新消息
}
}
}

接下来我们就可以使用ON_UPDATE_COMMAND_UI宏来添加消息响应了,这里不再说明。

补充:通过m_reBar.GetReBarCtrl().ShowBand(1,bShow);函数来显示或隐藏Band,界面会刷新不正常。

解决办法:先重绘工具栏,再重绘子窗口。

m_reBar.RedrawWindow();
m_static.RedrawWindow();
m_combo.RedrawWindow();
														
		

CDialog上使用CToolBar+CReBar的更多相关文章

  1. MFC 学习之 鼠标移动到Toolbar按钮上显示提示信息(tooltip)&comma;状态栏也随之改变

    1.在ResourceView里加入Toolbar资源,命名IDR_TOOLBAR1 2.在主程序的.h文件中加入变量:           CToolBar m_toolbar;CImageList ...

  2. VC MFC工具栏&lpar;CToolBar&rpar;控件

    一.工具栏 工具栏控件在控件面板里没有对应的选项(图标),但有一个工具栏控件类CToolBar,所以我们如果要创建一个工具栏控件并显示在窗口里的话,只能用代码来完成,事实上任何一种控件,都可以用代码创 ...

  3. VC MFC工具栏&lpar;CToolBar&rpar;控件(转)

    工具栏 工具栏控件在控件面板里没有对应的选项(图标),但有一个工具栏控件类CToolBar,所以我们如果要创建一个工具栏控件并显示在窗口里的话,只能用代码来完成,事实上任何一种控件,都可以用代码创建, ...

  4. (转载)VC&sol;MFC 工具栏上动态添加组合框等控件的方法

    引言 工具条作为大多数标准的Windows应用程序的 一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开 ...

  5. CDialogBar&lpar;对话条&rpar;和CReBar&lpar;伸缩条&rpar;的编程

    对话条是工具栏和无模式对话框相结合的产物,对话条和对话框类似,包含有标准的Windows控件,并且可以通过创建对话框模板来表示对话条. 伸缩条功能很强大,我们可以在伸缩条中直接增加CToolBar,C ...

  6. VC&sol;MFC 工具栏上动态添加组合框等控件的方法

    引言 工具条作为大多数标准的Windows应用程序的一个重要组成部分,使其成为促进人机界面友好的一个重要工具.通过工具条极大方便了用户对程序的操作,但是在由Microsoft Visual C++开发 ...

  7. 从PCI上读取数据 线程和定时器效率

    从PCI上读取数据 线程和定时器效率 线程: mythread=AfxBeginThread(StartContinuous,(LPVOID)1,THREAD_PRIORITY_NORMAL,0,CR ...

  8. VS2010&sol;MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)

    上一节中鸡啄米讲了菜单及CMenu类的使用,这一节讲与菜单有密切联系的工具栏. 工具栏简介 工具栏一般位于主框架窗口的上部,菜单栏的下方,由一些带图片的按钮组成.当用户用鼠标单击工具栏上某个按钮时,程 ...

  9. CDialog

    对话框和对话框类CDialog 对话框经常被使用,因为对话框可以从模板创建,而对话框模板是可以使用资源编辑器方便地进行编辑的. 模式和无模式对话框 对话框分两种类型,模式对话框和无模式对话框. 模式对 ...

随机推荐

  1. HTML5中支持新的媒体元素有这些

    HTML5对媒体的支持性很强,支持以下媒体元素: · audio  定义音频 · video  定义视频 · embed  作为外部应用的容器 · source  多种媒体源的支持 · track   ...

  2. C&num; 视频流操作

    发送视频流 void SendVideoBuffer(object bufferIn) { try { TcpClient tcp = ); NetworkStream ns = tcp.GetStr ...

  3. PHP5&period;4开启zend opcache缓存

    PHP5.5整合了zend opcache,但是5.4以下的需要自己安装. 介绍一下开启opcache方法,环境为wamp(php5.4.16) 下载dll文件 把php_opcache.dll放进p ...

  4. ckplayer视频播放插件使用

    研究ckplayer插件播放视频,播放视频需要配置信息修改如下: 1.设置ckplayer.js中的logo: 'null' 可以隐藏视频播放头部的图标: 2.设置ckplayer.js中的ckcpt ...

  5. property在括号中应该怎样写

    property 属性的定义,类似于get set assign: 简单的赋值,不更改索引计数 使用assign是针对基础的数据类型,比如NSinterger,CGFloat和c数据类型(int fl ...

  6. 下载文件 ,调用系统的方法&lpar;UIDocumentInteractionController&rpar; 查看

  7. Java偏向锁实现原理&lpar;Biased Locking&rpar;

    http://kenwublog.com/theory-of-java-biased-locking 阅读本文的读者,需要对Java轻量级锁有一定的了解,知道lock record, mark wor ...

  8. 实现一个栈类,类似STL中的栈

    1.思路讲解 stack集合类是一个简单的堆栈的实现. 这里有两个模板参数,T和size,T用于指定堆栈中的元素类型,my_size用于表示堆栈中项数的最大值. 类中添加方法isempty.isful ...

  9. 详解MariaDB数据库的触发器

    1.什么是触发器 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行 它比数据库本身标准的功能有更精细和更复杂的数据控制能力 2.触发器的作用: 2.1 安全性 可以基于数据库的 ...

  10. 第八节、图片分割之GrabCut算法、分水岭算法

    所谓图像分割指的是根据灰度.颜色.纹理和形状等特征把图像划分成若干互不交迭的区域,并使这些特征在同一区域内呈现出相似性,而在不同区域间呈现出明显的差异性.我们先对目前主要的图像分割方法做个概述,后面再 ...