Я записал wxPython программу, которую я перевожу в wxWidgets. Программа имеет прокрученное окно, которое отображает изображение. После Rappin, wxPython В Действии (Список 12.1), я использовал StaticBitmap в панели. При перемещении по последней wxWidgets документации я нашел страшное предупреждение, что wxStaticBitmap должен только использоваться для очень маленьких изображений. Это говорит, "... необходимо использовать собственное управление, если Вы хотите отобразить увеличенные изображения портативно". Хорошо. Покажите мне. Я не имею своего "собственного контроля".
Был Rappin неправильно, или действительно ли документация устарела?
Вопрос - новичок один, несомненно - то, что правильный путь состоит в том, чтобы сделать простое окно представления изображения в wxWidgets? Общедоступная замена для wxStaticBitmap была бы хороша. Я изучил программу "изображения" в wxWidgets "демонстрационном" каталоге. Это - столь же долгая Война и мир. Конечно, должен быть консервированный класс или простой рецепт.
Не позволяйте размеру образца «изображения» вводить вас в заблуждение, только необходимо несколько строк кода, чтобы сделать то, что вы хотите.
Найдите класс MyImageFrame
в файле image.cpp , это не что иное, как класс с частным полем растрового изображения, настраиваемым конструктором для установки растрового изображения и окна размер клиента и обработчик событий для EVT_PAINT
:
void OnPaint(wxPaintEvent& WXUNUSED(event))
{
wxPaintDC dc( this );
dc.DrawBitmap( m_bitmap, 0, 0, true /* use mask */ );
}
Поскольку вам не нужен класс фрейма, вот ваш рецепт: вы создаете простой потомок wxWindow
, который имеет аналогичный конструктор , обработчик рисования и дублирует методы 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()