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

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

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

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


person Jive Dadson    schedule 17.02.2010    source источник
comment
возможно, вместо «Invalidate()» mghie означало «Refresh()». (Это должен быть мод, чтобы ответить 0, но я не понимаю, как это сделать.)   -  person contributor    schedule 27.04.2010


Ответы (2)


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

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

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

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

person mghie    schedule 18.02.2010
comment
Я отмечаю это как ответ. Это выглядит легко. На самом деле я еще не научился работать, но я только начал. :-) - person Jive Dadson; 19.02.2010
comment
Фактический рабочий пример был бы замечательным. Я понял, что мне нужно добавить PrepareDC(dc) после wxPaintDC dc(this); Я понятия не имею, что это такое и зачем это нужно. Просто обезьяна-видит обезьяна-делает. Теперь у меня правильно отображаются изображения. Но я еще не смог зафиксировать щелчок мышью на изображении. Все еще борюсь. Вперед сквозь туман! - person Jive Dadson; 20.02.2010
comment
@Jive: см. docs.wxwidgets.org/2.8/, однако это помимо написания простой замены wxStaticBitmap. О щелчках мыши см. docs.wxwidgets.org/2.8/wx_wxmouseevent.html#wxmouseevent, ваш класс должен уметь их обрабатывать, поэтому вам нужно только подключить обработчик. view.cpp в образце docvwmdi имеет класс холста (потомок wxScrolledWindow), который выполняет как рисование, так и работу с мышью, возможно, его изучение поможет. - person mghie; 20.02.2010
comment
У меня сейчас эта часть работает. На самом деле, я уже сделал. Я думал, что в обработчике мыши установлена ​​точка останова, но это не так. Дух. Задавать вопросы на Stackoverflow слишком просто! Я занимаюсь этим постоянно, почти непрерывно с 1971 года, но мне удается отрываться, как болвану. Ну что ж. К следующему аллигатору. Я думаю, что он решает собрать мои курсоры в мусор, и я не знаю, почему. - person Jive Dadson; 20.02.2010

person    schedule
comment
Вероятно, вам не следует вызывать какой-либо код рисования в LoadImage(), вызова Invalidate() должно быть достаточно, тогда элемент управления будет перерисован, когда это будет удобно для системы. В этом может не быть необходимости или даже невозможно рисовать во время вызова LoadImage(). - person mghie; 21.02.2010
comment
1›------ Начата сборка: Проект: Munsell_picker, Конфигурация: Debug Win32 ------ 1›Компиляция... 1›main.cpp 1›.\main.cpp(114): ошибка C3861: 'Invalidate': идентификатор не найден - person Jive Dadson; 21.02.2010