2010-02-17 2 views
6

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

Был ли Rappin ошибочным или документация устарела?

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

+0

Возможно, вместо «Invalidate()», mghie означает «Обновить()». (Это должно быть мода, чтобы ответить 0, но я не вижу, как это сделать.) – contributor

ответ

3

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

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

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

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

+0

Я отмечаю это как ответ. Это выглядит просто. Я на самом деле не получил его на работу, но я только начал. :-) –

+0

Настоящий рабочий пример будет замечательным. Я понял, что мне нужно вставить «PrepareDC (dc)» после «wxPaintDC dc (this)»; Я понятия не имею, что это такое или почему это необходимо. Просто обезьяна - смотришь обезьяну. Теперь у меня есть отображение изображений. Но я еще не смог захватить щелчок мышью по изображению. Все еще борется. Вперед через туман! –

+0

@Jive: см. Http://docs.wxwidgets.org/2.8/wx_wxscrolledwindow.html#wxscrolledwindowpreparedc, однако это за пределами написания простой замены «wxStaticBitmap». Для щелчков мыши см. Http://docs.wxwidgets.org/2.8/wx_wxmouseevent.html#wxmouseevent, ваш класс должен иметь возможность обрабатывать их, поэтому вам нужно только подключить обработчик. * view.cpp * в образце * docvwmdi * имеет класс canvas (потомок 'wxScrolledWindow'), который выполняет как рисование, так и мышь, возможно, изучение этого поможет. – mghie

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() 
+0

Вероятно, вы не должны называть код рисования в 'LoadImage()', для вызова 'Invalidate()' должно быть достаточно, тогда управление будет перерисовано, когда оно будет удобно для системы. Это может быть необязательно, или даже невозможно рисовать в то время, когда вызывается 'LoadImage()'. – mghie

+0

1> ------ Сборка запущена: Проект: Munsell_picker, Конфигурация: Отладка Win32 ------ 1> Компиляция ... 1> main.cpp 1>. \ Main.cpp (114): ошибка C3861: «Invalidate»: идентификатор не найден –

Смежные вопросы