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

我正在使用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;
}

解决方法

对你来说可能为时已晚,但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,BOOL bHorz,BOOL /*bCustomizeMode*/,BOOL /*bHighlight*/,BOOL /*bDrawBorder*/,BOOL /*bGrayDisabledButtons*/)
{
    UINT nStyle = m_nStyle; 
    m_nStyle &= ~TBBS_DISABLED;

    CMFCToolBarButton::OnDraw (pDC,pImages,bHorz,FALSE,FALSE);

    m_nStyle = nStyle;
}

正如您所看到的那样,它非常轻巧,只使用按钮已经提供的内容,因此它也适用于视觉主题.

相关文章

一.C语言中的static关键字 在C语言中,static可以用来修饰局...
浅谈C/C++中的指针和数组(二) 前面已经讨论了指针...
浅谈C/C++中的指针和数组(一)指针是C/C++...
从两个例子分析C语言的声明 在读《C专家编程》一书的第三章时...
C语言文件操作解析(一)在讨论C语言文件操作之前,先了解一下...
C语言文件操作解析(三) 在前面已经讨论了文件打开操作,下面...