Как построить простое отображение изображения wxWidgets - PullRequest
6 голосов
/ 17 февраля 2010

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

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

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

Ответы [ 2 ]

3 голосов
/ 18 февраля 2010

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

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

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

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

2 голосов
/ 21 февраля 2010
// 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()
...