Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.02;
Скачать: CL | DM;

Вниз

Устранение мерцаний Image.   Найти похожие ветки 

 
Cr@sh ©   (2002-08-19 12:31) [0]

Ув. мастера, подскажите, пожалуйста, возможно ли устранить мерцание Image`a во время рисования на нем, особенно если используется событие ОнМаусМув.
Заранее спасибо.


 
Леха_   (2002-08-19 12:42) [1]

перерисовывать не все а только ту часть которая реально меняется
рисовать в памяти а потом копировать на экран


 
Voldemar ©   (2002-08-19 14:03) [2]

Image1.Canvas.ControlStyle:=ControlStyle+[csOpaque]; - и никакого мерцания.


 
Cr@sh ©   (2002-08-19 14:59) [3]

>Voldemar
Ошибочка вышла, у канваса нет контролстайла, а если такое делать для имэйджа, то все равно мерцает.
>Леха_
А не мог ли ты привести кой-нибудь примерчик, пожалуйста.


 
Kaban ©   (2002-08-19 15:03) [4]

IMHO если ты делаешь через mousemove, мигать все равно будет.
Попробуй так положи на форму таймер, установи маленький интервал
В мousemove создавай новую картинку и кидай ее на canvas по таймеру.


 
Dmitriy Polskoy ©   (2002-08-19 15:10) [5]

Я когда-то такое делал. Так вот получалось через установку какого-то свойства: толи Align, толи AutoSize. Попробуй.


 
Antonius ©   (2002-08-19 15:17) [6]

у некоторых контролов есть отличное свойство DoubleBuferred, но оно: 1 - рантайм онли 2 - по моему только у наследников WinControl. Свойство замечательное - напрочь устраняет мерцание у часто меняющихся контролов. Правда вывод ощутимо замедляется.


 
Dmitriy Polskoy ©   (2002-08-19 15:18) [7]

Точно, я вспомнил: надо для Image1 свойство Align установить в
alCustom(ну, или как тебе надо). Идея заключается в том, что Image постоянно держит один и тотже размер и не позволяет появляться мерцанию.


 
lenin ©   (2002-08-19 15:36) [8]


> Dmitriy Polskoy © (19.08.02 15:18)

Эта идея не работае, все равно мерцает.


> Kaban © (19.08.02 15:03)

И таймер тоже не помогает.

Я бы вообще отказался от Image. У меня была раньше аналогичная проблема, и я использовал вместо TImage TPaintBox.


 
Cr@sh ©   (2002-08-19 15:36) [9]

>Dmitriy Polskoy
Неа, не канает все равно мерцает.


 
Cr@sh ©   (2002-08-19 15:39) [10]

>lenin
У пэинт бокса нет транспарент, а мне надо, чтоб в нем график строился, фон был прозрачный, и еще чтоб не мерцал... :(


 
DeMoN-777 ©   (2002-08-19 15:41) [11]

Вот тебе мой совет, используй двойную буферезацию. Что-то типа этого Form1.DoubleBuffered:=true;

P.S

Скажешь что из этого получилось ;)


 
lenin ©   (2002-08-19 15:42) [12]


> Cr@sh ©

Я бы тебе посоветовал избавиться от Image. И воспользоваться вместо него TBitmap. Но в этом случае тебе предеться рисовать на конве либо формы, либо PaintBox-а. Но в данном случае никого мерцания не будет.


 
lenin ©   (2002-08-19 15:45) [13]


> Cr@sh © (19.08.02 15:39)
> >lenin
> У пэинт бокса нет транспарент, а мне надо, чтоб в нем график
> строился, фон был прозрачный, и еще чтоб не мерцал... :(

Я знаю, что у него нет транспарента. Ты рисуй на TBitmap-е, а затем выводи их на канву. Мерцания в этом случае не будет.


 
Cr@sh ©   (2002-08-19 15:46) [14]

>lenin
Я же говорю мне надо чтобы фон был прозрачным.


 
Cr@sh ©   (2002-08-19 15:51) [15]

2lenin
Че то ты меня постоянно на полминуты опережаешь, пока пишу, рефреш делаю, твое сообщение уже появляется...


 
lenin ©   (2002-08-19 16:05) [16]


> Cr@sh ©

Попробуй так:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormPaint(Sender: TObject);
private
{ Private declarations }
bm1, bm2: TBitmap;
procedure Draw;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var w,h: integer;
begin
bm1:=TBitmap.Create;
bm2:=TBitmap.Create;
w:=form1.Width;
h:=form1.Height;
bm1.Width:=w;
bm1.Height:=h;
bm2.Width:=w;
bm2.Height:=h;
bm1.Canvas.Pen.Width:=6;
bm1.Canvas.LineTo(300,300);
bm1.Canvas.MoveTo(300,0);
bm1.Canvas.LineTo(0,300);
bm2.TransparentMode:=tmFixed;
bm2.TransparentColor:=clWhite;
bm2.Transparent:=true;
bm2.Canvas.Brush.Color:=clWhite;
bm2.Canvas.FillRect(Rect(0,0,w,h));
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
bm2.Canvas.Pen.Color:=clRed;
bm2.Canvas.LineTo(x,y);
Draw;
end;

procedure TForm1.Draw;
var bbm: TBitmap;
begin
bbm:=TBitmap.Create;
bbm.Width:=form1.Width;
bbm.Height:=form1.Height;
bbm.Canvas.Draw(0,0,bm1);
bbm.Canvas.Draw(0,0,bm2);
Canvas.Draw(0,0,bbm);
bbm.Free;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
Draw;
end;

end.

Хотя это работает немного медленней, но качественней.


 
Cr@sh ©   (2002-08-19 16:08) [17]

Щас попробую... ... .. .


 
Cr@sh ©   (2002-08-19 16:21) [18]

2lenin
Блин, че то сегодня торможу, а как это можно применить вместе с имэйдж, при том, что график в имэйдже и эти линии должны быть сохранены в одном битмапе?


 
Леха_   (2002-08-19 16:24) [19]

>lenin
собственно то что я предлагал вторым вариантом только по хорошему нужно добавить блок try finally


 
lenin ©   (2002-08-19 16:29) [20]


> Cr@sh © (19.08.02 16:21)

Конкретнее, что ты хочешь.


> Леха_ (19.08.02 16:24)

Согласен с тобой. Этот код стряпался на скорую руку. Там еще в принципе bm1 и bm2 надо освободить.


 
Cr@sh ©   (2002-08-19 16:33) [21]

Вобщем в идеале должно быть следующее:
Есть два имэйджа один над другим, на нижнем сетка на верхнем(транспарент)-график, и нужно чтобы на этом графике с помощью твоего кода(стр. 2-3 форума (построение прямой)) можно было построить прямую без мерцаний. Вот собственно и все...


 
lenin ©   (2002-08-19 16:40) [22]

Вместо нижнего имиджа используй bm1, а вместо второго bm2.


 
Cr@sh ©   (2002-08-19 16:43) [23]

Пробуем... .. .


 
Cr@sh ©   (2002-08-19 17:06) [24]

>lenin
Если использовать TBitmap, то у них нет некоторых функций, которые есть у имэйджа например screentoclient, что мне очень надо. Если использовать PaintBox, то я у него не нашел транспарентмуд и тр.колор.
Может предложишь еще какой-нибудь вариант?
Я вот думаю возможно такое или нет:
Есть два имэйджа, как обычно - сверху, снизу. Но при при маусдаун создается прозрачный TBitmap и на нем строится прямая. А затем канвас битмапа комбинируется с канвасом имэйджа. Скажи возможно такое или нет. Возможно ли объединить эти канвасы не теряя данных на них?


 
DeMoN-777 ©   (2002-08-19 19:52) [25]

Я же тебе сказал в чём трабла.
Впиши эту строчку по OnCreate
Form1.DoubleBuffered:=true;


 
Cr@sh ©   (2002-08-20 06:56) [26]

>DeMon-777
Вписывал уже, все равно мерцает...


 
lenin ©   (2002-08-20 08:30) [27]


> Cr@sh © (19.08.02 17:06)
...
Есть два имэйджа, как обычно - сверху, снизу. Но при при маусдаун создается прозрачный TBitmap и на нем строится прямая. А затем канвас битмапа комбинируется с канвасом имэйджа. Скажи возможно такое или нет. Возможно ли объединить эти канвасы не теряя данных на них?

В принципе это возможно, но с имэджем все равно будет мерцать. Я бы тебе все равно бы посоветовал избавиться от них. Можно воспользовать PaintBox-ом, но одним, а не двумя. Т.е. битмапы выводить не на канву формы, а на канву PaintBox-а. И такие функции как ScreenToClient, брать не битмапов, а у PaintBox-а.


 
EVV   (2002-08-20 12:29) [28]

Правильно говорит DeMon-777.
Нужно использовать DoubleBuffered. При этом происходит прорисовка на виртуальную канву и прорисовка происходит только один раз. Кого интересует гляньте в исходники. Лучшего варианта нет. Я на это натыкался каогда писал графический редактор. И больше у меня таких вопросов не возникало.


 
Егор   (2002-08-20 12:44) [29]

>EVV (20.08.02 12:29)

Установка двойной буферизации как-то скажеться на скорость программы, производительность, загрузку системы? Извините, что вмешиваюсь.


 
EVV   (2002-08-20 13:23) [30]

>Егор
Я ничего подобного невидел.
Просто рисуется в памяти картинка и потом быстро прорисовывается на канву.
Любая нормальная прога интенсивно работающая с графикой должна буферизировать вывод.


 
Сергей Зимин   (2002-08-20 22:32) [31]

Породи от TImage свой компонент и у него блокируй WM_ERASEBACKGROUND
Будут вопросы -> на мыло pls.


 
mamont   (2002-08-21 08:18) [32]

Я делал так: после того как что-то нарисуешь делаешь image1.repaint насильно. Вообщем-то у меня ничего не мерцает.


 
SI-riuss ©   (2002-08-21 21:36) [33]

А я юзаю компоненту Graphics32 http://g32.org/ и у меня таких вопросов не возникает.


 
Mikhail ©   (2002-08-21 21:52) [34]

А по чему бы не задействовать OpenGL или DirectX?


 
Ev_genus ©   (2002-08-21 22:08) [35]

Это всё кустарные методы.

2 Mikhail
А если директх не установлен?

Нужно юзать апифункции, типа BitBlt. В хэлпе всё написано.



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

Текущий архив: 2002.09.02;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.02 c
1-3343
alex_x
2002-08-21 18:14
2002.09.02
Дата Project Build


4-3689
XTormentor
2002-06-28 14:08
2002.09.02
как через delphi6 запускать проги?


6-3539
zam
2002-06-21 18:37
2002.09.02
Как узнать имя пользователя под которым комп вошел в сеть(домен)?


14-3610
^Sanya
2002-08-07 22:06
2002.09.02
Работа с версией проекта


4-3659
ricks
2002-06-18 00:34
2002.09.02
Строка через Message