Как правильно отображать статический текст на MFC CToolBar, используя TBSTYLE_FLAT? - PullRequest
4 голосов
/ 20 января 2012

Я использую 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;
}

1 Ответ

1 голос
/ 12 июня 2013

Возможно, слишком поздно для вас, но пример TabControl, поставляемый с MFC, показывает вам, как это сделать.По сути, вы используете класс с именем 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;
}

Как вы можете видеть, он очень легкий и использует только то, что кнопка уже предоставляет, поэтому он работает и для визуальных тем..

...