Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2009, 18:00   #1
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию Двойная буферизация

Здравствуйте !
Хочу освоить Двойную буферизацию, но что то не получаеться,
не могу понять в чем проблема.

Ниже представлен код программы, подскажите где ошибка ?


Код:
.....

var
  Form1: TForm1;
  sam, buf:TBitmap;
  BufRct: TRect;
  x, y, TW: Integer;
  w, h: Integer;
  s: String;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
    s:= 'Это большой пример для маленькой компании.';

    sam:= TBitmap.Create;
    buf:= TBitmap.Create;

   sam.Width:=  ClientWidth;
   sam.Height:= (ClientHeight - sam.Canvas.TextHeight(s)) div 2;

   w:= sam.Width;
   h:= sam.Height;

   buf.Width:= w;
   buf.Height:=h;

   x:= ClientWidth;
   y:= 0;
   X := X - 100;
   sam.Canvas.Font.Color:= clRed;
   sam.Canvas.Font.Name := 'Georgia';
   sam.Canvas.Font.Size := 15;
   sam.Canvas.Font.Style:= [fsBold];
   sam.Transparent:= True;
   TW := sam.Canvas.TextWidth(s);

   sam.Canvas.TextOut(x,y,s);

   BufRct := Bounds(x + 1, y, w, h);
   Buf.Canvas.CopyRect(Buf.Canvas.ClipRect,Form1.Canvas,BufRct);

   Form1.Canvas.Draw(0,20,sam);

   Timer1.Enabled:= True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Form1.Canvas.Draw(0,20,sam);

X := X - 1;
If X <= -TW  then
X := ClientWidth;

 BufRct := Bounds(x + 1, y, w, h);
 Buf.Canvas.CopyRect(Buf.Canvas.ClipRect,Form1.Canvas,BufRct);
 sam.Canvas.TextOut(x,y,s);
 Form1.Canvas.Draw(0,20,sam);
end;

end.
Программа выводит бегущую строку на форму, при sam.Transparent:= True
она размазана, при sam.Transparent:= False идет нормально.
Конечно можно подобрать цвет sam.Canvas.Brush.Color:= clBtnFace , но
это на простом фоне, а если сложный фон (картинка). Подскажите где ошибка и
как ее исправить

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 26.03.2009, 20:29   #2
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

После перерисовки, очищай старое место. Тоесть нарисовал, решил переместить, очистил, нарисовал опять. Поему тотже самый repaint тебя спасёт.
Zeraim вне форума Ответить с цитированием
Старый 26.03.2009, 21:27   #3
DeKot
Участник клуба
 
Аватар для DeKot
 
Регистрация: 12.08.2008
Сообщений: 1,977
По умолчанию

Немного неправильный принцип отображения графики. Выбранный фон нужно хранить также в невидимом буфере и для "уничтожения" изменяемого рисунка (здесь текст также является графическим рисунком), брать из него область (Rect) по размеру рисунка и только после всех преобразований выводить результат на канву формы.
Посмотрите вот сюда : http://programmersforum.ru/showthread.php?t=38106 пост #6.
И не сомневайся даже ... отдых - кайф, работа - лажа!
DeKot вне форума Ответить с цитированием
Старый 26.03.2009, 23:38   #4
volod3000
Форумчанин
 
Аватар для volod3000
 
Регистрация: 18.12.2008
Сообщений: 266
По умолчанию

Спасибо DeKot за ссылку.
Нашел для себя полезную информацию 'Устранение эффекта мигания'.

Мало открыть человеку глаза, большинство еще просит указать дорогу и ждет волшебного пенделя.
volod3000 вне форума Ответить с цитированием
Старый 27.03.2009, 00:08   #5
ViktorXP
Форумчанин
 
Аватар для ViktorXP
 
Регистрация: 24.11.2006
Сообщений: 108
По умолчанию

Цитата:
Сообщение от Zeraim Посмотреть сообщение
После перерисовки, очищай старое место. Тоесть нарисовал, решил переместить, очистил, нарисовал опять. Поему тотже самый repaint тебя спасёт.
Вот именно изза того что VCL по этому принцыпу написана, так страшно компоненты моргают при ресайзе (если их много).
Кстате начиная с Висты мелкософтые начали решать эту проблему. они зделали BufferedPaint. хотя если учесть как там медленно выводится графика через привычный TCanvas (или навпрямую через WinApi) то это скорее компенсацыя тормозов. (тестыл в цыкле вывод градиента. на маленьких участках виста существенно обгоняет XP а вот на больших - нервно курит в сторонке)
ViktorXP вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц