Могу ли я использовать пользовательский цвет для конкретной вкладки ноутбука wx [Aui]

#c #wxwidgets

#c #wxwidgets

Вопрос:

Я пытаюсь раскрасить каждую вкладку в wxWidgets другим цветом, например, когда вы помечаете лист Excel, есть ли способ сделать это в версии wxWidgets на C , с AUI или без?

Ответ №1:

Я не думаю, что есть что-то, что позволит вам сделать это «из коробки»; но с блокнотом Aui вы можете написать пользовательский рисунок вкладки, чтобы раскрасить вкладки по своему усмотрению. Вот отвратительный пример, который я только что привел, чтобы продемонстрировать один из способов сделать это:

 // For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"

#ifdef __BORLANDC__
    #pragma hdrstop
#endif

// for all others, include the necessary headers (this file is usually all you
// need because it includes almost all "standard" wxWidgets headers)
#ifndef WX_PRECOMP
    #include "wx/wx.h"
#endif

#include <wx/aui/auibook.h>
#include <map>

class MyTabArt:public wxAuiGenericTabArt
{
public:
    MyTabArt():wxAuiGenericTabArt(){}

    wxAuiTabArt* Clone()
    {
        return new MyTabArt(*this);
    }

    void AddTabColor(wxWindow* w, const wxColoramp; c)
    {
        m_tabColors[w] = c;
    }

    virtual void DrawTab(wxDCamp; dc, wxWindow* wnd, const wxAuiNotebookPageamp; page,
                         const wxRectamp; rect, int closeButtonState,
                         wxRect* outTabRect, wxRect* outButtonRect,
                         int* xExtent) wxOVERRIDE
    {
        wxSize tabSize = GetTabSize(dc, wnd, page.caption, page.bitmap,
                                    page.active, closeButtonState, xExtent);

        wxCoord tabHeight = m_tabCtrlHeight;
        wxCoord tabWidth = tabSize.x;
        wxCoord tabX = rect.x;
        wxCoord tabY = rect.y   rect.height - tabHeight;

        wxRect tabRect(tabX, tabY, tabWidth, tabHeight);

        wxDCClipper clipper(dc, tabRect);

        auto it = m_tabColors.find(page.window);

        if ( it != m_tabColors.end() )
        {
            wxDCBrushChanger bchanger(dc, it->second);
            wxDCPenChanger pchanger(dc, it->second);
            dc.DrawRectangle(tabRect);
        }
        else
        {
            wxDCBrushChanger bchanger(dc, *wxGREEN);
            wxDCPenChanger pchanger(dc, *wxGREEN);
            dc.DrawRectangle(tabRect);
        }

        dc.DrawText(page.caption,tabRect.x,tabRect.y);

        *outTabRect = tabRect;
    }

private:
    std::map<wxWindow*,wxColor> m_tabColors;
};

class MyFrame: public wxFrame
{
    public:
        MyFrame();

    private:
};

MyFrame::MyFrame()
        :wxFrame(NULL, wxID_ANY, "AUI Tab", wxDefaultPosition, wxSize(600, 400))
{
    wxAuiNotebook * auiNotebook =
        new wxAuiNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
    wxPanel* panel1 = new wxPanel( auiNotebook, wxID_ANY );
    wxPanel* panel2 = new wxPanel( auiNotebook, wxID_ANY );
    auiNotebook->AddPage(panel1, "Page 1");
    auiNotebook->AddPage(panel2, "Page 2");

    MyTabArt* art = new MyTabArt();
    art->AddTabColor(panel1, *wxRED);
    art->AddTabColor(panel2, *wxBLUE);

    auiNotebook->SetArtProvider(art);
}

class MyApp : public wxApp
{
    public:
        virtual bool OnInit()
        {
            ::wxInitAllImageHandlers();
            MyFrame* frame = new MyFrame();
            frame->Show();
            return true;
        }
};

wxIMPLEMENT_APP(MyApp);
  

В Windows это чудовище выглядит следующим образом:

введите описание изображения здесь

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