![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как избежать мигания при прорисовке? [D6, XP]
Mr tray © (2006-11-09 21:38:00)На onmousemove я поставил repaint, и код, рисующий некоторую картинку. Но всё окно при каждом выполнении этого кода "мигает". То есть сначала показывается чистое окно, а потом только прорисовывается картинка. Как избежать мигания?
Anatoly Podgoretsky (2006-11-10 20:06:00) [1]> Mr tray (10.11.2006 18:46:19) [19]
> не пишите того, что не поможет решить автору его вопрос.
Ты тут не совсем прав, тут не служба поддержки, тут форум (заодно проверь по словарю иностранных слов что это значит), тут каждый сам решает, что ему писать и только модератор решает, чему быть опубликованым.
ЗЫ: у нас пост модерирование, удалить можно всегда, хоть спустря месяц, я вот например вчера удалял сообщения двухмесячной давности, они всплыли у меня в клиенте и не понравились мне, пришлось искать и удалять.
Anatoly Podgoretsky (2006-11-10 20:03:00) [2]> Ketmar (10.11.2006 18:34:17) [17]
Не говорит, что все выдержит.
Может проверить?
Percent (2006-11-10 19:49:00) [3]В вашем случае выполняется двойная работа...
Расчитать один раз, а отрисовать два раза - не помогает?
Mr tray (2006-11-10 19:44:00) [4]
> Percent (10.11.06 19:02) [20]
В вашем случае выполняется двойная работа... У меня выполняется не только moveto и lineto, в моем случае проделывается больший объем работы, поэтому у меня заметно притормаживает. И всё равно видно мелькание...
Ketmar (2006-11-10 19:06:00) [5]>[18] Mr tray 10-Nov-2006, 18:42
>Честно говоря, и не думал грубить тебе.
не от меня. %-) я просто предупредил.
>[19] Mr tray 10-Nov-2006, 18:46
>И вообще, Ketmar, это форум о программировании, а не о
>чувстве юмора... Так что, просьба: не пишите того, что не
>поможет решить автору его вопрос.
о. а это не сразу заметил. неко, диктовать условия вы будете у себя дома. а на этом форуме есть модераторы, они мне скажут всё, что надо, сами. без ваших титанических усилий по поддержанию порядка как-то обойдёмся.
Percent (2006-11-10 19:02:00) [6]мм. можно поподробней... зачем менять 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;
Mr tray (2006-11-10 18:46:00) [7]И вообще, Ketmar, это форум о программировании, а не о чувстве юмора... Так что, просьба: не пишите того, что не поможет решить автору его вопрос.
Mr tray (2006-11-10 18:42:00) [8]
> на грубость нарываешься...
Честно говоря, и не думал грубить тебе. По-моему в "не случится. Не с такими умниками сталкивался... и всё ещё не перегорел!" никакой грубости, обращенной либо к тебе, либо к MBo © (10.11.06 14:44) [11], нет. А вот в
> >упрощаешь ломаную, например, методом Douglas-Pecker, ине
> надо так жестоко. у автора короткое замыкание может случиться.
> %-)
есть грубость, которая, причем, обращена именно ко мне. Вот и стоит задуматься, а где же грубость?..
Ketmar (2006-11-10 18:34:00) [9]>[16] Mr tray 10-Nov-2006, 18:19
на грубость нарываешься...
Mr tray (2006-11-10 18:19:00) [10]
> не надо так жестоко. у автора короткое замыкание может случиться.
> %-)
не случится. Не с такими умниками сталкивался... и всё ещё не перегорел!
Ketmar (2006-11-10 18:13:00) [11]>[11] MBo(c) 10-Nov-2006, 14:44
>упрощаешь ломаную, например, методом Douglas-Pecker, и
не надо так жестоко. у автора короткое замыкание может случиться. %-)
Mr tray (2006-11-10 18:08:00) [12]
> на OnMouseMove вызываещь Repaint (либо Invalidate)В OnPaint
> рисуешь на кансе все, что душе угодно.
всё равно мигает
> Если уж хочется в OnMouseMove, то прорисовывай дважды, установив
> Pen.Mode в режим XOR или NOT (или какой-нибудь другой -
> посмотри, их там много). И забудь тогда про Repaint.
мм. можно поподробней... зачем менять pen.mode?
Loginov Dmitry (2006-11-10 15:34:00) [13]Mr tray (10.11.06 14:36) [10]
Давайте попробую. Только как? Разъясните, пожалуйста.
на OnMouseMove вызываещь Repaint (либо Invalidate)
В OnPaint рисуешь на кансе все, что душе угодно.
Percent (2006-11-10 14:59:00) [14]Если уж хочется в OnMouseMove, то прорисовывай дважды, установив Pen.Mode в режим XOR или NOT (или какой-нибудь другой - посмотри, их там много). И забудь тогда про Repaint.
MBo (2006-11-10 14:44:00) [15]>Рисую силовые линии и эквипотенциали электростатических полей точечных зарядов.
Вручную? Тогда запоминаешь точки в массиве, потом упрощаешь ломаную, например, методом Douglas-Pecker, и рассчитываешь плавные кривые (например, несложные сплайны)
Mr tray (2006-11-10 14:36:00) [16]
> Это погоня за призраком. Зачем тебе сотни раз в секунду
> обновлять?
Хотел бы - вообще поставил бы прорисовку по клику.
> Вполне достаточно Invalidate+OnPaint, как уже сказали
Давайте попробую. Только как? Разъясните, пожалуйста.
MBo (2006-11-10 14:24:00) [17]>Как я буду рисовать в обработчике OnPaint, если мне нужна новая картинка после каждого движения мыши?
Это погоня за призраком. Зачем тебе сотни раз в секунду обновлять?
Вполне достаточно Invalidate+OnPaint, как уже сказали
Mr tray (2006-11-10 14:21:00) [18]
> И рисовать, как уже сказано, в обработчике OnPaint.
Как я буду рисовать в обработчике OnPaint, если мне нужна новая картинка после каждого движения мыши?
> Можно конечно рисовать и в onmousemove (если осторожно),
> но тогда repаint там точно не нужно.
Ещё и как нужно. Если я не вызываю repaint, то каждая последующая картинка накладывается на уже существующее изображение.
> Что ты рисуешь, потребитель?
Рисую силовые линии и эквипотенциали электростатических полей точечных зарядов.
Percent (2006-11-10 00:38:00) [19]Рисуй в промежуточном буфере (TBitmap). В конце отрисовки выводи содержимое буфера на канву формы TCanvas.Draw()
Это делает DoubleBuffered.
Loginov Dmitry (2006-11-09 23:48:00) [20]Рисуй в промежуточном буфере (TBitmap). В конце отрисовки выводи содержимое буфера на канву формы
TCanvas.Draw()