![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Устранение мерцаний Image.
Cr@sh © (2002-08-19 12:31:00)Ув. мастера, подскажите, пожалуйста, возможно ли устранить мерцание Image`a во время рисования на нем, особенно если используется событие ОнМаусМув.
Заранее спасибо.
Ev_genus (2002-08-21 22:08:00) [1]Это всё кустарные методы.
2 Mikhail
А если директх не установлен?
Нужно юзать апифункции, типа BitBlt. В хэлпе всё написано.
Mikhail (2002-08-21 21:52:00) [2]А по чему бы не задействовать OpenGL или DirectX?
SI-riuss (2002-08-21 21:36:00) [3]А я юзаю компоненту Graphics32 http://g32.org/и у меня таких вопросов не возникает.
mamont (2002-08-21 08:18:00) [4]Я делал так: после того как что-то нарисуешь делаешь image1.repaint насильно. Вообщем-то у меня ничего не мерцает.
Сергей Зимин (2002-08-20 22:32:00) [5]Породи от TImage свой компонент и у него блокируй WM_ERASEBACKGROUND
Будут вопросы -> на мыло pls.
EVV (2002-08-20 13:23:00) [6]>Егор
Я ничего подобного невидел.
Просто рисуется в памяти картинка и потом быстро прорисовывается на канву.
Любая нормальная прога интенсивно работающая с графикой должна буферизировать вывод.
Егор (2002-08-20 12:44:00) [7]>EVV (20.08.02 12:29)
Установка двойной буферизации как-то скажеться на скорость программы, производительность, загрузку системы? Извините, что вмешиваюсь.
EVV (2002-08-20 12:29:00) [8]Правильно говорит DeMon-777.
Нужно использовать DoubleBuffered. При этом происходит прорисовка на виртуальную канву и прорисовка происходит только один раз. Кого интересует гляньте в исходники. Лучшего варианта нет. Я на это натыкался каогда писал графический редактор. И больше у меня таких вопросов не возникало.
lenin (2002-08-20 08:30:00) [9]
> Cr@sh © (19.08.02 17:06)
...
Есть два имэйджа, как обычно - сверху, снизу. Но при при маусдаун создается прозрачный TBitmap и на нем строится прямая. А затем канвас битмапа комбинируется с канвасом имэйджа. Скажи возможно такое или нет. Возможно ли объединить эти канвасы не теряя данных на них?
В принципе это возможно, но с имэджем все равно будет мерцать. Я бы тебе все равно бы посоветовал избавиться от них. Можно воспользовать PaintBox-ом, но одним, а не двумя. Т.е. битмапы выводить не на канву формы, а на канву PaintBox-а. И такие функции как ScreenToClient, брать не битмапов, а у PaintBox-а.
Cr@sh (2002-08-20 06:56:00) [10]>DeMon-777
Вписывал уже, все равно мерцает...
DeMoN-777 (2002-08-19 19:52:00) [11]Я же тебе сказал в чём трабла.
Впиши эту строчку по OnCreate
Form1.DoubleBuffered:=true;
Cr@sh (2002-08-19 17:06:00) [12]>lenin
Если использовать TBitmap, то у них нет некоторых функций, которые есть у имэйджа например screentoclient, что мне очень надо. Если использовать PaintBox, то я у него не нашел транспарентмуд и тр.колор.
Может предложишь еще какой-нибудь вариант?
Я вот думаю возможно такое или нет:
Есть два имэйджа, как обычно - сверху, снизу. Но при при маусдаун создается прозрачный TBitmap и на нем строится прямая. А затем канвас битмапа комбинируется с канвасом имэйджа. Скажи возможно такое или нет. Возможно ли объединить эти канвасы не теряя данных на них?
Cr@sh (2002-08-19 16:43:00) [13]Пробуем... .. .
lenin (2002-08-19 16:40:00) [14]Вместо нижнего имиджа используй bm1, а вместо второго bm2.
Cr@sh (2002-08-19 16:33:00) [15]Вобщем в идеале должно быть следующее:
Есть два имэйджа один над другим, на нижнем сетка на верхнем(транспарент)-график, и нужно чтобы на этом графике с помощью твоего кода(стр. 2-3 форума (построение прямой)) можно было построить прямую без мерцаний. Вот собственно и все...
lenin (2002-08-19 16:29:00) [16]
> Cr@sh © (19.08.02 16:21)
Конкретнее, что ты хочешь.
> Леха_ (19.08.02 16:24)
Согласен с тобой. Этот код стряпался на скорую руку. Там еще в принципе bm1 и bm2 надо освободить.
Леха_ (2002-08-19 16:24:00) [17]>lenin
собственно то что я предлагал вторым вариантом только по хорошему нужно добавить блок try finally
Cr@sh (2002-08-19 16:21:00) [18]2lenin
Блин, че то сегодня торможу, а как это можно применить вместе с имэйдж, при том, что график в имэйдже и эти линии должны быть сохранены в одном битмапе?
Cr@sh (2002-08-19 16:08:00) [19]Щас попробую... ... .. .
lenin (2002-08-19 16:05:00) [20]
> 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.
Хотя это работает немного медленней, но качественней.