Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-3381
maxim2
2002-08-21 12:51
2002.09.02
Может здесь кто знает как сделать Skin


3-3315
Eraser
2002-08-12 10:44
2002.09.02
О запросе


14-3562
Devid
2002-08-04 20:43
2002.09.02
Помогите люде!!!!!!!!!!!!!ПЛЗ!!!


1-3338
Elena_K
2002-08-20 11:28
2002.09.02
---|Ветка была без названия|---


1-3478
Zevs_mv
2002-08-21 10:23
2002.09.02
Мастера помогите с Excel





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский