Как создать простой дисплей изображения wxWidgets

Я записал wxPython программу, которую я перевожу в wxWidgets. Программа имеет прокрученное окно, которое отображает изображение. После Rappin, wxPython В Действии (Список 12.1), я использовал StaticBitmap в панели. При перемещении по последней wxWidgets документации я нашел страшное предупреждение, что wxStaticBitmap должен только использоваться для очень маленьких изображений. Это говорит, "... необходимо использовать собственное управление, если Вы хотите отобразить увеличенные изображения портативно". Хорошо. Покажите мне. Я не имею своего "собственного контроля".

Был Rappin неправильно, или действительно ли документация устарела?

Вопрос - новичок один, несомненно - то, что правильный путь состоит в том, чтобы сделать простое окно представления изображения в wxWidgets? Общедоступная замена для wxStaticBitmap была бы хороша. Я изучил программу "изображения" в wxWidgets "демонстрационном" каталоге. Это - столь же долгая Война и мир. Конечно, должен быть консервированный класс или простой рецепт.

6
задан Jive Dadson 21 February 2010 в 00:05
поделиться

2 ответа

Не позволяйте размеру образца «изображения» вводить вас в заблуждение, только необходимо несколько строк кода, чтобы сделать то, что вы хотите.

Найдите класс MyImageFrame в файле image.cpp , это не что иное, как класс с частным полем растрового изображения, настраиваемым конструктором для установки растрового изображения и окна размер клиента и обработчик событий для EVT_PAINT :

void OnPaint(wxPaintEvent& WXUNUSED(event))
{
    wxPaintDC dc( this );
    dc.DrawBitmap( m_bitmap, 0, 0, true /* use mask */ );
}

Поскольку вам не нужен класс фрейма, вот ваш рецепт: вы создаете простой потомок wxWindow , который имеет аналогичный конструктор , обработчик рисования и дублирует методы wxStaticBitmap , которые вы используете в своем коде. Может быть, просто один метод для установки нового растрового изображения и изменения размера элемента управления до новых размеров растрового изображения.

3
ответ дан 17 December 2019 в 04:46
поделиться
// 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()
2
ответ дан 17 December 2019 в 04:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: