Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Устранение мерцаний Image.


Страницы:   1 2

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.

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо