Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Вниз

Как избежать мигания при прорисовке?   Найти похожие ветки 

 
Mr tray   (2006-11-09 21:38) [0]

На onmousemove я поставил repaint, и код, рисующий некоторую картинку. Но всё окно при каждом выполнении этого кода "мигает". То есть сначала показывается чистое окно, а потом только прорисовывается картинка. Как избежать мигания?


 
Percent   (2006-11-09 22:10) [1]

На onmousemove я поставил repaint, и код, рисующий некоторую картинку

Код отрисовки контрола, должен располагаться в методе Paint (или обработчике OnPaint). Нигде в другом месте этот код располагаться не должен. Табу.

То есть сначала показывается чистое окно

Такое заявление - лишь признание того, что ты не контролируешь поведение своей программы.

Как избежать мигания?

1. Не давать перерисовываться чистому окну.
2. Рисовать в соответствующем методе.
3. Отрисовывать только то, что реально требует отрисовки (или затерлось, или изменилось).
4. DoubleBuffered := true; (только в крайнем случае)
5. ControlStyle := ControlStyle + [csOpaque];

И что за картинка вообще? Растр?
Установи ее в качестве кисти формы и забудь про ручную отрисовку.
Или используй TImage.

А вообще - методов очень много. А ты даже строчки кода не привел...


 
Ketmar ©   (2006-11-09 22:10) [2]

обрабатывать, например, WM_ERASEBKGND


 
Mr tray   (2006-11-09 23:08) [3]

я рисую програмно на касвасе главной формы. и при изменении координат курсора требуется обновить картинку, так как она зависит он этих координат. как в paint засунуть это?


 
Percent   (2006-11-09 23:10) [4]

Что ты рисуешь, потребитель?


 
guav ©   (2006-11-09 23:14) [5]

> На onmousemove я поставил repaint

Не луяше ли Invalidate ?
И рисовать, как уже сказано, в обработчике OnPaint.
Можно конечно рисовать и в onmousemove (если осторожно), но тогда repаint там точно не нужно.


 
Loginov Dmitry ©   (2006-11-09 23:48) [6]

Рисуй в промежуточном буфере (TBitmap). В конце отрисовки выводи содержимое буфера на канву формы
TCanvas.Draw()


 
Percent   (2006-11-10 00:38) [7]

Рисуй в промежуточном буфере (TBitmap). В конце отрисовки выводи содержимое буфера на канву формы TCanvas.Draw()

Это делает DoubleBuffered.


 
Mr tray   (2006-11-10 14:21) [8]


> И рисовать, как уже сказано, в обработчике OnPaint.

Как я буду рисовать в обработчике OnPaint, если мне нужна новая картинка после каждого движения мыши?

> Можно конечно рисовать и в onmousemove (если осторожно),
>  но тогда repаint там точно не нужно.

Ещё и как нужно. Если я не вызываю repaint, то каждая последующая картинка накладывается на уже существующее изображение.
> Что ты рисуешь, потребитель?

Рисую силовые линии и эквипотенциали электростатических полей точечных зарядов.


 
MBo ©   (2006-11-10 14:24) [9]

>Как я буду рисовать в обработчике OnPaint, если мне нужна новая картинка после каждого движения мыши?

Это погоня за призраком. Зачем тебе сотни раз в секунду обновлять?
Вполне достаточно Invalidate+OnPaint, как уже сказали


 
Mr tray   (2006-11-10 14:36) [10]


> Это погоня за призраком. Зачем тебе сотни раз в секунду
> обновлять?

Хотел бы - вообще поставил бы прорисовку по клику.

> Вполне достаточно Invalidate+OnPaint, как уже сказали

Давайте попробую. Только как? Разъясните, пожалуйста.


 
MBo ©   (2006-11-10 14:44) [11]

>Рисую силовые линии и эквипотенциали электростатических полей точечных зарядов.

Вручную? Тогда запоминаешь точки в массиве, потом упрощаешь ломаную, например, методом Douglas-Pecker, и рассчитываешь плавные кривые (например, несложные сплайны)


 
Percent   (2006-11-10 14:59) [12]

Если уж хочется в OnMouseMove, то прорисовывай дважды, установив Pen.Mode в режим XOR или NOT (или какой-нибудь другой - посмотри, их там много). И забудь тогда про Repaint.


 
Loginov Dmitry ©   (2006-11-10 15:34) [13]

Mr tray   (10.11.06 14:36) [10]
Давайте попробую. Только как? Разъясните, пожалуйста.


на OnMouseMove вызываещь Repaint (либо Invalidate)

В OnPaint рисуешь на кансе все, что душе угодно.


 
Mr tray   (2006-11-10 18:08) [14]


> на OnMouseMove вызываещь Repaint (либо Invalidate)В OnPaint
> рисуешь на кансе все, что душе угодно.

всё равно мигает
> Если уж хочется в OnMouseMove, то прорисовывай дважды, установив
> Pen.Mode в режим XOR или NOT (или какой-нибудь другой -
> посмотри, их там много). И забудь тогда про Repaint.

мм. можно поподробней... зачем менять pen.mode?


 
Ketmar ©   (2006-11-10 18:13) [15]

>[11] MBo(c) 10-Nov-2006, 14:44
>упрощаешь ломаную, например, методом Douglas-Pecker, и
не надо так жестоко. у автора короткое замыкание может случиться. %-)


 
Mr tray   (2006-11-10 18:19) [16]


> не надо так жестоко. у автора короткое замыкание может случиться.
>  %-)

не случится. Не с такими умниками сталкивался... и всё ещё не перегорел!


 
Ketmar ©   (2006-11-10 18:34) [17]

>[16] Mr tray 10-Nov-2006, 18:19
на грубость нарываешься...


 
Mr tray   (2006-11-10 18:42) [18]


> на грубость нарываешься...

Честно говоря, и не думал грубить тебе. По-моему в "не случится. Не с такими умниками сталкивался... и всё ещё не перегорел!" никакой грубости, обращенной либо к тебе, либо к MBo ©   (10.11.06 14:44) [11], нет. А вот в
> >упрощаешь ломаную, например, методом Douglas-Pecker, ине
> надо так жестоко. у автора короткое замыкание может случиться.
>  %-)

есть грубость, которая, причем, обращена именно ко мне. Вот и стоит задуматься, а где же грубость?..


 
Mr tray   (2006-11-10 18:46) [19]

И вообще, Ketmar, это форум о программировании, а не о чувстве юмора... Так что, просьба: не пишите того, что не поможет решить автору его вопрос.


 
Percent   (2006-11-10 19:02) [20]

мм. можно поподробней... зачем менять pen.mode?

Я не знаю, что ты там рисуешь, но, если тебе надо трассировать движения мыши, то, возможно, подойдет что-то накшталт такого:

type
 TForm1 = class(TForm)
   {...}
 private
   FP: TPoint;
   procedure DrawTrace;
 end;

procedure TForm1.DrawTrace;
begin
 Canvas.Pen.Color := clBlack;
 Canvas.Pen.Mode := pmNOT;
 Canvas.MoveTo(0, 0);
 Canvas.LineTo(FP.X, FP.Y);
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 if (Button = mbLeft) then
 begin
   FP := Point(X, Y);
   DrawTrace;
 end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
begin
 if (ssLeft in Shift) then
 begin
   DrawTrace;
   FP := Point(X, Y);
   DrawTrace;
 end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 if (Button = mbLeft) then
  DrawTrace;
end;


 
Ketmar ©   (2006-11-10 19:06) [21]

>[18] Mr tray 10-Nov-2006, 18:42
>Честно говоря, и не думал грубить тебе.
не от меня. %-) я просто предупредил.

>[19] Mr tray 10-Nov-2006, 18:46
>И вообще, Ketmar, это форум о программировании, а не о
>чувстве юмора... Так что, просьба: не пишите того, что не
>поможет решить автору его вопрос.
о. а это не сразу заметил. неко, диктовать условия вы будете у себя дома. а на этом форуме есть модераторы, они мне скажут всё, что надо, сами. без ваших титанических усилий по поддержанию порядка как-то обойдёмся.


 
Mr tray   (2006-11-10 19:44) [22]


> Percent   (10.11.06 19:02) [20]

В вашем случае выполняется двойная работа... У меня выполняется не только moveto и lineto, в моем случае проделывается больший объем работы, поэтому у меня заметно притормаживает. И всё равно видно мелькание...


 
Percent   (2006-11-10 19:49) [23]

В вашем случае выполняется двойная работа...

Расчитать один раз, а отрисовать два раза - не помогает?


 
Anatoly Podgoretsky ©   (2006-11-10 20:03) [24]

> Ketmar  (10.11.2006 18:34:17)  [17]

Не говорит, что все выдержит.
Может проверить?


 
Anatoly Podgoretsky ©   (2006-11-10 20:06) [25]

> Mr tray  (10.11.2006 18:46:19)  [19]

> не пишите того, что не поможет решить автору его вопрос.

Ты тут не совсем прав, тут не служба поддержки, тут форум (заодно проверь по словарю иностранных слов что это значит), тут каждый сам решает, что ему писать и только модератор решает, чему быть опубликованым.

ЗЫ: у нас пост модерирование, удалить можно всегда, хоть спустря месяц, я вот например вчера удалял сообщения двухмесячной давности, они всплыли у меня в клиенте и не понравились мне, пришлось искать и удалять.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.11.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.042 c
3-1159197350
Silver...
2006-09-25 19:15
2006.11.26
SQL - ... Field1, Field2, Field2 NOT IN (...)


15-1162915760
xazan
2006-11-07 19:09
2006.11.26
Экспертные системы


2-1162984685
kolius
2006-11-08 14:18
2006.11.26
Как избавить от мелькания TMemo?


11-1139299870
ElDev
2006-02-07 11:11
2006.11.26
Ребята помогите, нужен MHMonthCalendar!


6-1152433865
anton773
2006-07-09 12:31
2006.11.26
закачка файла





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский