我使用wxWidgets 'An Image Panel'代码。这里我只做了一个改动。我想让帧大小等于图像大小,我的图像大小是762x463,但我的帧大小不同。frame 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());
...
一个替代的,可能更好的解决方案是覆盖wxWindow::DoGetBestClientSize为您的wxImagePanel类,并让它返回image.GetSize();
。
Bind(wxEVT_PAINT, &wxImagePanel::paintEvent, this);
的构造函数
- 在
MyApp::OnInit
的正文中,修改 一行
frame->SetSizer(sizer);
frame->SetSizerAndFit(sizer);
使用SetSizerAndFit方法将告诉框架将自身调整为显示其所有内容所需的最小尺寸。由于在步骤1中,图像面板的最小大小被设置为image
的大小,并且图像面板是框架的唯一内容,因此框架将调整大小以适合图像。