Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > моргание при анимации в GDI+


Автор: stalkerok 16.6.2009, 10:39
Помогите избавиться от моргания, пробовал frmMain.DoubleBuffered:= true; но тогда нет прорисовки.
Код

unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GDIPAPI, GDIPOBJ, ExtCtrls, StdCtrls, IniFiles;

type
  TfrmMain = class(TForm)
    imgMain: TImage;
    Timer: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormPaint(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
  private
  public
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

var
  graphics : TGPGraphics;
  SolidBrush: TGPSolidBrush;
  Pen: TGPPen;
  ox, oy: integer;

//******************************************************************************
//Create
procedure CreateGraphics();
begin
  graphics.SetSmoothingMode(SmoothingModeAntiAlias);
  Pen := TGPPen.Create(MakeColor(100, 0, 0, 255));
  SolidBrush := TGPSolidBrush.Create(MakeColor(150, 255, 0, 0));
  //frmMain.DoubleBuffered:= true;
end;

//******************************************************************************
//Free
procedure FreeGraphics();
begin
  Pen.Free;
  SolidBrush.Free;
end;

//******************************************************************************
//Figure
procedure CreateFigure();
begin
  graphics.DrawLine(Pen, ox, oy, ox+100, oy+100);
  graphics.FillEllipse(SolidBrush, ox-3, oy-3, 6, 6);
end;

//******************************************************************************
//Close
procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeGraphics;
end;

//******************************************************************************
//Main
procedure TfrmMain.FormCreate(Sender: TObject);
var
  i: integer;
begin
  ox:=0;
  oy:=0;
end;

//******************************************************************************
//Paint
procedure TfrmMain.FormPaint(Sender: TObject);
begin
  graphics:= TGPGraphics.Create(frmMain.imgMain.Canvas.Handle);
  CreateGraphics;
  graphics.Clear(MakeColor(255, 255, 255, 255));
  try
    CreateFigure;
  finally
    graphics.Free;
  end;
end;

//******************************************************************************
//Timer
procedure TfrmMain.TimerTimer(Sender: TObject);
begin
  ox:=ox+1;
  oy:=oy+1;
  if ox>=300 then ox:=0;
  if oy>=300 then oy:=0;
  frmMain.Repaint;
end;

end.

Автор: Alexeis 16.6.2009, 11:10
  Нужно делает двойную буферизацию средствами GDI+. Создать битмапку TGPBitmap, рисовать на него, а потом его отрисовать на экран, т.е. на TGPGraphics

Автор: stalkerok 16.6.2009, 11:28
Alexeis а как это сделать? можно пример.
спасибо!

Автор: Alexeis 16.6.2009, 11:33
Код

procedure TForm1.PaintGPBitmap;
var GDI,g: TGPGraphics;
    Img: TGPBitmap;
begin
  GDI := TGPGraphics.Create(Self.Canvas.Handle);
  Img := TGPBitmap.Create(ClientWidth, ClientHeight, PixelFormat32bppRGB);
  g := TGPGraphics.Create(Img);

  g.Clear(MakeColor(255,255,255));
  PaintText(g);
  g.Free;

  GDI.DrawImage(Img, 0, 0);
  GDI.Free;
  Img.Free;
end;


http://www.gamedev.ru/code/forum/?id=87303

Автор: stalkerok 16.6.2009, 12:10
Спасибо!!!!
может кому пригодиться:
Код

unit main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GDIPAPI, GDIPOBJ, ExtCtrls, StdCtrls, IniFiles;

type
    TfrmMain = class(TForm)
    Timer: TTimer;
    procedure TimerTimer(Sender: TObject);
  private
    procedure CreateFigure(Gdi: TGPGraphics);
    procedure Paint;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

var
  ox, oy: integer;

//******************************************************************************
//Figure
procedure TfrmMain.CreateFigure(Gdi: TGPGraphics);
var
  SolidBrush: TGPSolidBrush;
  Pen: TGPPen;
begin
  Pen := TGPPen.Create(MakeColor(100, 0, 0, 255));
  SolidBrush := TGPSolidBrush.Create(MakeColor(150, 255, 0, 0));
  Gdi.DrawLine(Pen, ox, oy, ox+100, oy+100);
  Gdi.FillEllipse(SolidBrush, ox-3, oy-3, 6, 6);
  Pen.Free;
  SolidBrush.Free;
end;

//******************************************************************************
//Paint
procedure TfrmMain.Paint;
var
  graphics_buf: TGPGraphics;
  graphics : TGPGraphics;
  graphics_img: TGPBitmap;
begin
  graphics:= TGPGraphics.Create(Self.Canvas.Handle);
  graphics_img:= TGPBitmap.Create(ClientWidth, ClientHeight, PixelFormat32bppRGB);
  graphics_buf:= TGPGraphics.Create(graphics_img);
  graphics_buf.SetSmoothingMode(SmoothingModeAntiAlias);
  graphics_buf.Clear(MakeColor(255, 255, 255, 255));
  CreateFigure(graphics_buf);
  graphics_buf.Free;
  graphics.DrawImage(graphics_img, 0, 0);
  graphics.Free;
  graphics_img.Free;
end;

//******************************************************************************
//Timer
procedure TfrmMain.TimerTimer(Sender: TObject);
begin
  ox:=ox+1;
  oy:=oy+1;
  if ox>=300 then ox:=0;
  if oy>=300 then oy:=0;
  Paint;
end;

end.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)