如何让wxColorPickerCtrl更窄?

时间:2016-03-14 15:52:49

标签: wxwidgets

wxColourPickerCtrl (WXMSW):如果看起来不太糟糕可以缩小吗?

我正在尝试在wxWidgets / DialogBlocks项目中保存一些水平空间。我认为可以保存的一个地方是wxColorPickerCtrl的宽度,看起来像是95像素宽。

colorpicker default appearance

这似乎不必要地宽泛。然而,当我将它的宽度设置为更好的东西时,比如25px,我会得到一些令人震惊的丑陋。

colorpicker 25px wide--bad!

是否有(支持的)方法可以让控件缩小? 似乎有可能,因为我在DialogBlocks中创建它,当我在GUI构建器中插入控件时,应用程序向我展示了一些非常好的东西。但是,当我构建它时,它永远不会这样呈现。

colorpicker 25px wide in DialogBlocks builder--nice!

我知道GUI构建器向我显示一个控件而不是静态图像(au3info表示它是一个按钮,与我在检查由编译的正在运行的应用程序创建的窗口时所说的相同),所以看起来像这样应该是可能的。我只是不知道如何。

我尝试了一些明智的(恕我直言)风格改变,但无济于事。选择器控件不会调整/剪裁渲染按钮上的图像。

有没有办法让控件变得非常小,比如正方形?我一直无法找到任何这样的例子(在DialogBlocks GUI构建器之外)

附录

我调试了我的简单项目,并执行了wxColourPickerCtrl构造函数到generic\clrpickerg.cpp wxGenericColourButton::Create()

m_bitmap = wxBitmap( 60, 13 );

如果我将硬编码宽度更改为13,那么按钮看起来就像我想要的那样。 有没有办法改变这个不完全可访问的成员对象的基础位图

HACKED SOLUTION

根据答案的建议,我必须继承两个 wxGenericColourButton(更改位图)和wxColourPickerCtrl(使用新的按钮类)。这将对wxWidgets内部的变化敏感,但我找不到更好的选择。

class _wxGenericColourButton : public wxGenericColourButton {
public:
    _wxGenericColourButton() {}
    _wxGenericColourButton( wxWindow *parent,
                            wxWindowID id,
                            const wxColour& col = *wxBLACK,
                            const wxPoint& pos = wxDefaultPosition,
                            const wxSize& size = wxDefaultSize,
                            long style = wxCLRBTN_DEFAULT_STYLE,
                            const wxValidator& validator = wxDefaultValidator,
                            const wxString& name = wxColourPickerWidgetNameStr )
    {
        Create(parent,id,col,pos,size,style,validator,name);
    }
    bool Create( wxWindow *parent,
                 wxWindowID id,
                 const wxColour& col = *wxBLACK,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = wxCLRBTN_DEFAULT_STYLE,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxColourPickerWidgetNameStr )
    {
        // Generally taken from wxGenericColourButton::Create() [clrpickerg.cpp:44]

        // Make the bitmap smaller by default. Enlarging the button should work fine.
        m_bitmap = wxBitmap(13, 13);

        // create this button
        if (!wxBitmapButton::Create( parent, id, m_bitmap, pos,
                                     size, style | wxBU_AUTODRAW, validator, name ))
        {
            wxFAIL_MSG( wxT("wxGenericColourButton creation failed") );
            return false;
        }

        // and handle user clicks on it
        Connect(GetId(), wxEVT_BUTTON,
                wxCommandEventHandler(wxGenericColourButton::OnButtonClick),
                NULL, this);

        m_colour = col;
        UpdateColour();
        InitColourData();

        return true;
    }
};

class _wxColourPickerCtrl : public wxColourPickerCtrl {
public:
    _wxColourPickerCtrl() {}

    _wxColourPickerCtrl( wxWindow *parent, wxWindowID id,
                         const wxColour& col = *wxBLACK, const wxPoint& pos = wxDefaultPosition,
                         const wxSize& size = wxDefaultSize, long style = wxCLRP_DEFAULT_STYLE,
                         const wxValidator& validator = wxDefaultValidator,
                         const wxString& name = wxColourPickerCtrlNameStr)
    {
        Create(parent, id, col, pos, size, style, validator, name);
    }

    bool Create( wxWindow *parent, wxWindowID id,
                 const wxColour& col = *wxBLACK,
                 const wxPoint& pos = wxDefaultPosition,
                 const wxSize& size = wxDefaultSize,
                 long style = wxCLRP_DEFAULT_STYLE,
                 const wxValidator& validator = wxDefaultValidator,
                 const wxString& name = wxColourPickerCtrlNameStr)
    {
        // This code is generally taken from: wxColourPickerCtrl::Create() [clrpickercmn.cpp:51]

        if (!wxPickerBase::CreateBase(parent, id, col.GetAsString(), pos, size,
                                      style, validator, name))
            return false;

        // Use our "enhanced" _wxGenericColourButton instead of the one with hardcoded,
        //   undesirable behavior.
        m_picker = new _wxGenericColourButton(this, wxID_ANY, col,
                                              wxDefaultPosition, wxDefaultSize,
                                              GetPickerStyle(style));           
        // Copied from clrpickercmn.cpp
        wxPickerBase::PostCreation();
        m_picker->Connect(wxEVT_COLOURPICKER_CHANGED,
                          wxColourPickerEventHandler(wxColourPickerCtrl::OnColourChange),
                          NULL, this);

        return true;
    }
};

1 个答案:

答案 0 :(得分:1)

不幸的是,没有干净的方法来解决这个bug。您可以从wxGenericColourButton派生并更改其m_bitmap,然后调用UpdateColour(),但这将使用未记录的,并且可能会更改API,而且通常很难看。

这确实应该在wxGenericColourButton本身修复,位图应该根据提供的大小计算(并且在大小改变时也会更新!)并且应该不难做到。如果您决定尝试这样做,请不要犹豫,将补丁提交给wxWidgets。