Показать сообщение отдельно
  #1  
Старый 26.03.2009, 14:18
Аватар для volod3000
volod3000 volod3000 вне форума
Новичок
 
Регистрация: 25.12.2008
Сообщения: 71
Репутация: 114
Вопрос Двойная буферизация

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

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

Код:
....

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(round(x + sin(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 , но
это на простом фоне, а если сложный фон (картинка).Подскажите где ошибка и
как ее исправить.
Ответить с цитированием