c++ - 如何使用 TBSTYLE_FLAT 在 MFC CToolBar 上正确显示静态文本?

标签 c++ mfc toolbar

我正在使用 VS2005 和 MFC。我按照一些在线代码将静态文本添加到工具栏。然而,当样式设置为 TBSTYLE_FLAT 或 (TBSTYLE_FLAT | TBSTYLE_TRANSPARENT) 时,分隔符变得可见并且看起来像文本上方的一个小刻度线。有没有更好的方法在 CToolBar 上显示静态文本或使分隔符在文本后面不可见?谢谢!

screenshot

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;
}

最佳答案

对您来说可能为时已晚,但是 MFC 附带的 TabControl 示例向您展示了如何操作。基本上,您可以像使用 CMFCToolBarButton 和 consorts 一样使用名为 CToolbarLabel 的类(在示例中为您实现):

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;
}

如您所见,它非常轻便,仅使用按钮已经提供的内容,因此它也适用于视觉主题。

关于c++ - 如何使用 TBSTYLE_FLAT 在 MFC CToolBar 上正确显示静态文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8946439/

相关文章:

c++ - 如何在 vc++ 6 中使用 mfc 标记选中的菜单项?

c++ - MFC 静态链接未解析的外部符号

c++ - 在 MFC C++ 中获取桌面分辨率

c# - WPF 工具栏和 StackPanel 在裁剪时自动将 ClipToBounds ="True"

c++ - 调试 gcc 插件

c++ - 如何检查变量是否仍然有效或在其上使用了 std::move?

c++ - std::unique_lock<mutex> 和 conditional_variable cond 的关系

c++ - 包含特定对象的 STL 容器模板参数

Eclipse 垂直工具栏

c# - Internet Explorer 工具栏的上下文菜单