如何使用 TBSTYLE_FLAT 在 MFC CToolBar 上正确显示静态文本?
Posted
技术标签:
【中文标题】如何使用 TBSTYLE_FLAT 在 MFC CToolBar 上正确显示静态文本?【英文标题】:How to show static text correctly on MFC CToolBar using TBSTYLE_FLAT? 【发布时间】:2012-01-20 18:55:55 【问题描述】:我正在使用 VS2005 和 MFC。我在网上按照一些代码将静态文本添加到工具栏。但是,将样式设置为 TBSTYLE_FLAT 或 (TBSTYLE_FLAT | TBSTYLE_TRANSPARENT),分隔符变得可见,看起来像文本上方的一个小刻度线。有没有更好的方法在 CToolBar 上显示静态文本或使分隔符在文本后面不可见?谢谢!
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT | TBSTYLE_TRANSPARENT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
//Create Static Text
CRect rect;
int nIndex = m_wndToolBar.GetToolBarCtrl().CommandToIndex(ID_STATIC_TEST);
m_wndToolBar.SetButtonInfo(nIndex, ID_STATIC_TEST, TBBS_SEPARATOR, 40);
m_wndToolBar.GetToolBarCtrl().GetItemRect(nIndex, &rect);
rect.top = 5;
rect.right = rect.left + 50;
if(!m_static.Create("Test", WS_CHILD | WS_VISIBLE | SS_CENTER, rect, &m_wndToolBar))
TRACE(_T("Failed to create Static Text\n"));
return FALSE;
// TODO: Delete these three lines if you don't want the toolbar to be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
【问题讨论】:
您在网上查到的代码不正确。它只是向工具栏添加一个静态控件。工具栏不知道它或说明它的存在。 【参考方案1】:对您来说可能为时已晚,但 MFC 附带的 TabControl 示例向您展示了如何做到这一点。基本上,您使用一个名为 CToolbarLabel 的类(在示例中为您实现),就像使用 CMFCToolBarButton 和 consorts 一样:
m_wndToolBar.ReplaceButton(ID_LABEL, CToolbarLabel(ID_LABEL, L"Some label: "));
为了完整起见,这里是 CToolbarLabel 的实现:
标题:
#pragma once
class CToolbarLabel : public CMFCToolBarButton
DECLARE_SERIAL(CToolbarLabel)
public:
CToolbarLabel (UINT nID = 0, LPCTSTR lpszText = NULL);
virtual void OnDraw (CDC* pDC, const CRect& rect, CMFCToolBarImages* pImages,
BOOL bHorz = TRUE, BOOL bCustomizeMode = FALSE,
BOOL bHighlight = FALSE,
BOOL bDrawBorder = TRUE,
BOOL bGrayDisabledButtons = TRUE);
;
实现文件:
#include "stdafx.h"
#include "ToolbarLabel.h"
IMPLEMENT_SERIAL(CToolbarLabel, CMFCToolBarButton, 1)
CToolbarLabel::CToolbarLabel (UINT nID, LPCTSTR lpszText)
if (lpszText != NULL)
m_strText = lpszText;
m_bText = TRUE;
m_nID = nID;
m_iImage = -1;
void CToolbarLabel::OnDraw (CDC* pDC, const CRect& rect, CMFCToolBarImages* pImages,
BOOL bHorz, BOOL /*bCustomizeMode*/, BOOL /*bHighlight*/,
BOOL /*bDrawBorder*/, BOOL /*bGrayDisabledButtons*/)
UINT nStyle = m_nStyle;
m_nStyle &= ~TBBS_DISABLED;
CMFCToolBarButton::OnDraw (pDC, rect, pImages, bHorz, FALSE,
FALSE, FALSE, FALSE);
m_nStyle = nStyle;
如您所见,它非常轻巧,仅使用按钮已经提供的功能,因此它也适用于视觉主题。
【讨论】:
以上是关于如何使用 TBSTYLE_FLAT 在 MFC CToolBar 上正确显示静态文本?的主要内容,如果未能解决你的问题,请参考以下文章
如何动态创建CMFCToolbar的SetOriginalState?