我写了一个wxPython程序,我正在翻译成wxWidgets。该程序有一个滚动窗口,显示图像。在Rappin, wxPython In Action (清单12.1)之后,我在一个面板中使用了一个StaticBitmap。在浏览最新的wxWidgets文档时,我发现dire warning只能将wxStaticBitmap用于非常小的图像。它说,“......如果你想要便携地显示更大的图像,你应该使用自己的控制。”好的。给我看看。我没有“自己的控制权”。
拉平错了,或文件是否过时了?
问题 - 一个新手,毫无疑问 - 是什么是在wxWidgets中做一个简单的图像视图窗口的正确方法? wxStaticBitmap的直接替代品会很好。我查看了wxWidgets“samples”目录中的“image”程序。这是一场战争与和平。当然必须有一个罐头类或简单的配方。
答案 0 :(得分:3)
不要让“图像”样本的大小欺骗你,只需几行代码就可以做你想做的事。
在 image.cpp 文件中搜索MyImageFrame
类,它只不过是一个带有私有位图字段的类,一个用于设置位图的自定义构造函数和窗口客户端大小和EVT_PAINT
的事件处理程序:
void OnPaint(wxPaintEvent& WXUNUSED(event))
{
wxPaintDC dc( this );
dc.DrawBitmap( m_bitmap, 0, 0, true /* use mask */ );
}
因为你不想在这里使用框架类:你创建一个wxWindow
的简单后代,它有一个类似的构造函数,绘制处理程序并复制你在你的wxStaticBitmap
中使用的方法码。也许只是一种方法来设置新的位图并将控件的大小调整为新的位图尺寸。
答案 1 :(得分:2)
// A scrolled window for showing an image.
class PictureFrame: public wxScrolledWindow
{
public:
PictureFrame()
: wxScrolledWindow()
, bitmap(0,0)
{;}
void Create(wxWindow *parent, wxWindowID id = -1)
{
wxScrolledWindow::Create(parent, id);
}
void LoadImage(wxImage &image) {
bitmap = wxBitmap(image);
SetVirtualSize(bitmap.GetWidth(), bitmap.GetHeight());
wxClientDC dc(this);
PrepareDC(dc);
dc.DrawBitmap(bitmap, 0, 0);
}
protected:
wxBitmap bitmap;
void OnMouse(wxMouseEvent &event) {
int xx,yy;
CalcUnscrolledPosition(event.GetX(), event.GetY(), &xx, &yy);
event.m_x = xx; event.m_y = yy;
event.ResumePropagation(1); // Pass along mouse events (e.g. to parent)
event.Skip();
}
void OnPaint(wxPaintEvent &event) {
wxPaintDC dc(this);
PrepareDC(dc);
dc.DrawBitmap(bitmap, 0,0, true);
}
private:
DECLARE_EVENT_TABLE()
};
BEGIN_EVENT_TABLE(PictureFrame,wxScrolledWindow)
EVT_PAINT(PictureFrame::OnPaint)
EVT_MOUSE_EVENTS(PictureFrame::OnMouse)
END_EVENT_TABLE()