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 处更改:
- 在构造函数
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);
也给构造函数。
- 在
MyApp::OnInit
的正文中,更改行
frame->SetSizer(sizer);
到
frame->SetSizerAndFit(sizer);
使用 SetSizerAndFit 方法将告诉框架将自身调整为显示其所有内容所需的最小尺寸。由于在步骤 1 中,图像面板的最小尺寸设置为 image
的大小,并且图像面板是框架的唯一内容,因此框架的大小将适合图像。
我正在使用 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 处更改:
- 在构造函数
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);
也给构造函数。
- 在
MyApp::OnInit
的正文中,更改行
frame->SetSizer(sizer);
到
frame->SetSizerAndFit(sizer);
使用 SetSizerAndFit 方法将告诉框架将自身调整为显示其所有内容所需的最小尺寸。由于在步骤 1 中,图像面板的最小尺寸设置为 image
的大小,并且图像面板是框架的唯一内容,因此框架的大小将适合图像。