On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение



Пост N: 33
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 19.02.07 11:47. Заголовок: Серьёзная проблема с выводом окна


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

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 7 [только новые]


модератор




Пост N: 434
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 19.02.07 11:57. Заголовок: Re:


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


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 34
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 19.02.07 12:41. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить
модератор




Пост N: 435
Зарегистрирован: 25.05.05
ссылка на сообщение  Отправлено: 19.02.07 13:48. Заголовок: Re:


AM пишет:

 цитата:
Это - несколько кривых (с помощью Polybezier или Polyline, данные берутся из DBF - пока так).


Теперь ясно
Перед перерисовкой картинки не забывай удалять старую с помощью команды:
ERASE WINDOW Form_1

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 35
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 19.02.07 15:10. Заголовок: Re:


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 114
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 19.02.07 22:15. Заголовок: Re:


Судя по описанию, возникают проблемы с "утечкой памяти". Надо внимательно посмотреть как используются ресурсы. т.е. должно быть

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





Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 115
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 20.02.07 00:25. Заголовок: Re:


Вместо

ERASE WINDOW
SendMessage( _HMG_MainHandle, WM_PAINT, 0, 0 )

можно использовать

InvalidateRect( _HMG_MainHandle, 1 )
UpdateWindow( _HMG_MainHandle )

теоретически должно быть быстрее


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 36
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 20.02.07 11:25. Заголовок: Re:


Петр пишет:

 цитата:
Судя по описанию, возникают проблемы с "утечкой памяти".


Спасибо за подсказку, видимо, надо искать в этом направлении. Я почему-то думал, что дело в скорости, а не в количестве перевыводов.

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 171
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет