我正在尝试在wxWidgets / DialogBlocks项目中保存一些水平空间。我认为可以保存的一个地方是wxColorPickerCtrl
的宽度,看起来像是95像素宽。
这似乎不必要地宽泛。然而,当我将它的宽度设置为更好的东西时,比如25px,我会得到一些令人震惊的丑陋。
是否有(支持的)方法可以让控件缩小? 似乎有可能,因为我在DialogBlocks中创建它,当我在GUI构建器中插入控件时,应用程序向我展示了一些非常好的东西。但是,当我构建它时,它永远不会这样呈现。
我知道GUI构建器向我显示一个控件而不是静态图像(au3info表示它是一个按钮,与我在检查由编译的正在运行的应用程序创建的窗口时所说的相同),所以看起来像这样应该是可能的。我只是不知道如何。
我尝试了一些明智的(恕我直言)风格改变,但无济于事。选择器控件不会调整/剪裁渲染按钮上的图像。
有没有办法让控件变得非常小,比如正方形?我一直无法找到任何这样的例子(在DialogBlocks GUI构建器之外)
我调试了我的简单项目,并执行了wxColourPickerCtrl构造函数到generic\clrpickerg.cpp
wxGenericColourButton::Create()
m_bitmap = wxBitmap( 60, 13 );
如果我将硬编码宽度更改为13,那么按钮看起来就像我想要的那样。 有没有办法改变这个不完全可访问的成员对象的基础位图?
根据答案的建议,我必须继承两个 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;
}
};
答案 0 :(得分:1)
不幸的是,没有干净的方法来解决这个bug。您可以从wxGenericColourButton
派生并更改其m_bitmap
,然后调用UpdateColour()
,但这将使用未记录的,并且可能会更改API,而且通常很难看。
这确实应该在wxGenericColourButton
本身修复,位图应该根据提供的大小计算(并且在大小改变时也会更新!)并且应该不难做到。如果您决定尝试这样做,请不要犹豫,将补丁提交给wxWidgets。