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



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



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

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

704   2  

2 ответов:

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

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

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

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

// 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()

Comments

    Ничего не найдено.