6

我编写了一个 wxPython 程序,并将其翻译成 wxWidgets。该程序有一个显示图像的滚动窗口。在 Rappin,wxPython In Action(清单 12.1)之后,我在面板中使用了 StaticBitmap。在浏览最新的 wxWidgets 文档时,我发现了一个可怕的警告,即 wxStaticBitmap 只能用于非常小的图像。它说,“......如果你想便携地显示更大的图像,你应该使用自己的控件。” 好的。给我看看。我没有“自己的控制权”。

是 Rappin 错了,还是文档过时了?

问题 - 一个新手,毫无疑问 - 在 wxWidgets 中做一个简单的图像视图窗口的正确方法是什么?wxStaticBitmap 的替代品会很好。我查看了 wxWidgets“samples”目录中的“image”程序。这是一场战争与和平。 当然必须有一个罐头类或一个简单的食谱。

4

2 回答 2

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你在代码中使用的方法。也许只是一种设置新位图并将控件大小调整为新位图尺寸的方法。

于 2010-02-18T07:59:35.600 回答
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()
于 2010-02-21T00:36:04.330 回答