Форум: "Основная";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];
ВнизУстранение мерцаний 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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.008 c