wxWidgets:图像面板中的框架大小没有改变

wxWidgets: Frame size is not changing in Image panel

我正在使用 wxWidgets 'An Image Panel' 代码。这里我只做了一处改动。 我希望帧大小应该等于图像大小,我的图像大小是 762x463,但我的帧大小不同。框架 SetSize 函数不起作用。

wxImagePanel::wxImagePanel(wxFrame* parent, wxString file, wxBitmapType format) :
wxPanel(parent)
{
    image.LoadFile(file, format);
}

void wxImagePanel::paintEvent(wxPaintEvent & evt)
{
    // depending on your system you may need to look at double-buffered dcs
    wxPaintDC dc(this);
    render(dc);
}

void wxImagePanel::paintNow()
{
    // depending on your system you may need to look at double-buffered dcs
    wxClientDC dc(this);
    render(dc);
}

void wxImagePanel::render(wxDC&  dc)
{
    dc.DrawBitmap( image, 0, 0, false );
}

class MyApp: public wxApp
    {
        
        wxFrame *frame;
        wxImagePanel * drawPane;
    public:
        bool OnInit()
        {
            // make sure to call this first
            wxInitAllImageHandlers();
            
            wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
            wxBitmap image(wxT("properties.png"), wxBITMAP_TYPE_PNG);
            frame = new wxFrame(NULL, wxID_ANY, wxT("Hello wxDC"), wxPoint(50,50), wxSize(image.GetWidth(), image.GetHeight()));  // 762x463
            
            // then simply create like this
            drawPane = new wxImagePanel( frame, wxT("image.jpg"), wxBITMAP_TYPE_JPEG);
            sizer->Add(drawPane, 1, wxEXPAND);
            
            frame->SetSizer(sizer);
            
            frame->Show();
            return true;
        } 
        
    };

要使框架大小适合显示图像,您需要进行 2 处更改:

  1. 在构造函数wxImagePanel::wxImagePanel中,您需要添加一行来设置图像面板的最小尺寸。
wxImagePanel::wxImagePanel(wxFrame* parent, wxString file, wxBitmapType format) :
wxPanel(parent)
{
    image.LoadFile(file, format);
    SetMinSize(image.GetSize());
...

另一种可能更好的解决方案是为您的 wxImagePanel class 覆盖 wxWindow::DoGetBestClientSize 并使其 return image.GetSize();.

顺便说一句,在上面显示的代码中,没有任何内容将绘画处理程序实际连接到绘画事件,因此您可能还想添加一行

Bind(wxEVT_PAINT, &wxImagePanel::paintEvent, this);

也给构造函数。

  1. MyApp::OnInit的正文中,更改行
frame->SetSizer(sizer);

frame->SetSizerAndFit(sizer);

使用 SetSizerAndFit 方法将告诉框架将自身调整为显示其所有内容所需的最小尺寸。由于在步骤 1 中,图像面板的最小尺寸设置为 image 的大小,并且图像面板是框架的唯一内容,因此框架的大小将适合图像。