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

Написах програма wxPython, която превеждам на wxWidgets. Програмата има превъртащ се прозорец, който показва изображение. Следвайки Rappin, wxPython в действие (списък 12.1), използвах StaticBitmap в панел. Докато сърфирах в най-новата документация на wxWidgets, намерих страшно предупреждение, че wxStaticBitmap трябва да бъде само използва се за много малки изображения. Той казва: "...трябва да използвате свой собствен контрол, ако искате да показвате преносимо по-големи изображения." Добре. Покажи ми. Нямам "собствен контрол".

Дали Rappin греши или документацията е остаряла?

Въпросът - без съмнение за начинаещ - е кой е правилният начин да се направи прост прозорец за изглед на изображение в 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 има клас canvas (потомък на 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, Конфигурация: Отстраняване на грешки в Win32 ------ 1›Компилиране... 1›main.cpp 1›.\main.cpp(114) : грешка C3861: „Невалидност“: идентификаторът не е намерен - person Jive Dadson; 21.02.2010