Как построить простой дисплей изображения wxWidgets
Я написал программу wxPython, которую я перевожу в wxWidgets. Программа имеет прокручиваемое окно, которое отображает изображение. Следуя Rappin, wxPython In Action (листинг 12.1), я использовал StaticBitmap внутри панели. Просматривая последнюю документацию wxWidgets, я обнаружилужасное предупреждение , что wxStaticBitmap следует использовать только для очень маленьких изображений. Там написано:"... вы должны использовать свой собственный контроль, если вы хотите, чтобы отображать большие изображения портативно." Окей. Покажи мне. Я не есть мой " собственный контроль."
Был ли Раппин неправ, или документация устарела?
Вопрос-новичок, без сомнения - Как правильно сделать простое окно просмотра изображений в wxWidgets? Была бы неплохая замена для wxstaticbitmap. Я заглянул в программу "image" в каталоге wxWidgets "samples". Это так же долго, как Война и мир. конечно, должен быть консервированный класс или простой рецепт.
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