Форум » GUI » Серьёзная проблема с выводом окна » Ответить

Серьёзная проблема с выводом окна

AM: Товарищи, кто поможет вот с такой неувязочкой. У меня сделано так: при изменении параметров (масштабов и проч.) выполняется перевывод картинки в окне (по ON CHANGE или ACTION). Если менять параметры слишком быстро, то всё сбивается - окна меняют размеры и положение, линии теряют цвета и толщину, потом картинки налезают друг на друга, и, если продолжать дрючить, то можно добиться, что без кнопки RESET не выйти (это в XP!) - не работают ALT-TAB,ALT-ENTER,ALT-F4,CTRL-ALT-DEL, курсор мыши пропадает, в общем, жуть. Я подумал - картинка начинает перевыводиться, когда не закончена ещё предыдущая и попробовал обойти это при помощи флага - не помогает (видимо, выводится параллельно с вычислениями). Т.е. я обнаружил, что иногда это происходит - процедура перевывода вызывается, когда она уже вызвана - но сбои происходят и без этого. Конечно, можно и нужно оптимизировать саму процедуру для ускорения, но всему есть предел, и хотелось бы решить проблему принципиально. Сбои происходят тем чаще, чем больше окно. Очень прошу помочь того, кто знает, в чём тут дело, проблема-то не шуточная.

Ответов - 7

gfilatov: AM пишет: при изменении параметров (масштабов и проч.) выполняется перевывод картинки в окне (по ON CHANGE или ACTION). Попробуй определить фоновую картинку с помощью следующих команд: 1) картинка берется из внешнего файла hearts.bmp: DEFINE BKGBRUSH newBrush PATTERN IN WINDOW Form_Main BITMAP hearts.bmp 2) картинка берется из ресурсов приложения WALL: DEFINE BKGBRUSH newBrush PATTERN IN Form_Main BITMAP WALL и, естественно, убери перевывод из события ON CHANGE

AM: Нет, Григорий, ты не понял (я не точно выразился). Картинка не из файла, а я её формирую. Это - несколько кривых (с помощью Polybezier или Polyline, данные берутся из DBF - пока так). Меняются масштабы по X и Y, а также сдвиги, вкл/выкл точек, вкл/выкл сетки, вкл/выкл каждой кривой, тип кривой, цвет и толщина линий. Можно, конечно, в некоторых случаях ввести оптимизацию и не перевыводить всё, но, скажем, при изменении масштабов без этого не обойтись.

gfilatov: AM пишет: Это - несколько кривых (с помощью Polybezier или Polyline, данные берутся из DBF - пока так). Теперь ясно Перед перерисовкой картинки не забывай удалять старую с помощью команды: ERASE WINDOW Form_1


AM: В том-то и дело - ERASE WINDOW у меня уже есть. Но спасибо за подсказку - попробую поиграть: переставлять erase/hide/show.

Петр: Судя по описанию, возникают проблемы с "утечкой памяти". Надо внимательно посмотреть как используются ресурсы. т.е. должно быть hDC := GetDC( hWnd ) .. ReleaseDC( hWnd, hDC ) hPen := CreatePen( PS_SOLID, 5, Random( 65535 ) ) .. DeleteObject( hPen ) с кистями также надо аккуратно. Т.е. создали ресурс - использовали - удалили (если конечно не предполагается повторное использование). Потом, иногда удобнее вместо hDC := GetDC( hWnd ) .. ReleaseDC( hWnd, hDC ) использовать local cPS BeginPaint( hWnd, @cPS ) - подготовливаем окно к отображению информации в ответ на сообщение WM_PAINT что-то рисуем EndPaint( hWnd, @cPS ) - завершаем операции по отображению в окне. Что надо знать 1) приложение не должно вызывать метод BeginPaint за исключением ответа на WM_PAINT сообщение; 2) каждое обращение к методу BeginPaint должно иметь обращение к методу EndPaint Пример исп.BeginPaint см. source\tsbrowse

Петр: Вместо ERASE WINDOW SendMessage( _HMG_MainHandle, WM_PAINT, 0, 0 ) можно использовать InvalidateRect( _HMG_MainHandle, 1 ) UpdateWindow( _HMG_MainHandle ) теоретически должно быть быстрее

AM: Петр пишет: Судя по описанию, возникают проблемы с "утечкой памяти". Спасибо за подсказку, видимо, надо искать в этом направлении. Я почему-то думал, что дело в скорости, а не в количестве перевыводов.



полная версия страницы