Конференция "Media" » Проблемма с GDI+ [D7, WinXP]
 
  • unknowing (15.03.08 09:32) [0]
    Всем привет! Вот код класса (примерно):

    uses
    Windows,GDIPAPI,GDIPOBJ;
    type
    TGyroHorizon = class(TObject)
    private
     graphics : TGPGraphics;
     Bitmap : TGpBitmap;
     MplayBack : TGPGraphics;
     cBitmap: TGPCachedBitmap;
     Pen: TGPPen;

    // protected

    public

    constructor Create (AOwner: TObject; Playback : HDC);
    destructor  Destroy; override;
    procedure View();

    end;

    implementation

    constructor TGyroHorizon. Create (AOwner: TObject; Playback : HDC);
    begin
     Bitmap:= TGpBitmap.Create(100 ,100 ,2498570);
     graphics := TGPGraphics.Create(Bitmap);
     graphics.Clear(aclBlack);
     MplayBack :=TGPGraphics.Create(Playback);
     Pen := TGPPen.Create(aclWhite);
     View(20);
      inherited Create;
    end;

    destructor  TGyroHorizon.Destroy;
    begin
     Pen.Free;
     graphics.Free;
     MplayBack.Free;
     Bitmap.Free;
    inherited Destroy;
    end;

    procedure TGyroHorizon.View(R : integer);
    begin

    cBitmap:= TGPCachedBitmap.Create(bitmap,MplayBack);
    graphics.DrawEllipse(Pen, 10, 20, R, R);
    MplayBack.DrawCachedBitmap(cBitmap, 0, 0);
    cBitmap.Free;
    end;
    Вызываю конструктор GyroHorizon. Create в событии OnCreate основной формы.
    При вызове GyroHorizon.View ничего не происходит..:) Где ошибка? Куда девался DC?
  • JohnJ (19.03.08 00:57) [1]
    У меня похожая проблема:
    Когда делаю прорисовку как в примерах (в PaintBox), то всё рисуется, но хочется всё это рисовать на собственный Bitmap:
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
     Bitmap.Free;
    end;

    procedure TForm1.Image1Click(Sender: TObject);
    begin
     with Image1.Picture.Bitmap do
      begin
        Width := Bitmap.Width;
        Height := Bitmap.Height;
        Canvas.CopyRect(Canvas.ClipRect, Bitmap.Canvas, Bitmap.Canvas.ClipRect);
      end;
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    var i: integer;
        FN: string;
        Y: integer;
    begin
     Bitmap := TBitmap.Create;
     Bitmap.Width := PaintBox1.Width;
     Bitmap.Height := PaintBox1.Height;
     GDIPlusInstr := TGDIP.Create(Bitmap.Handle);
     GDIPlusInstr.Clear(GDIPlusInstr.ARGBColor(255, 236, 233, 216));
     for i := Low(Instr) to High(Instr) do
      begin
        FN := ExtractFilePath(Application.ExeName) + 'pics\'+Instr[i];
        Y := Y0 + (W_INSTR + 2 * (S_INSTR + R_INSTR)) * i;
        if FileExists(FN) then
         GDIPlusInstr.DrawImageFile(FN, X0, Y, W_INSTR, W_INSTR);
        GDIPlusInstr.DrawRect(X0 - S_INSTR, Y - S_INSTR, W_INSTR + 2 * S_INSTR, W_INSTR + 2 * S_INSTR, R_INSTR, GDIPlusInstr.ARGBColor(255, 236, 233, 216));
      end;
     Y := Y0 + (W_INSTR + 2 * (S_INSTR + R_INSTR)) * CurInstr;
     GDIPlusInstr.DrawRect(X0 - S_INSTR, Y - S_INSTR, W_INSTR + 2 * S_INSTR, W_INSTR + 2 * S_INSTR, R_INSTR, GDIPlusInstr.ARGBColor(255, 128, 128, 200));
     GDIPlusInstr.Free;
    end;


    В результате после клика на Image1 появляется белый прямоугльник, с размерами PaintBox, но в нём ничего нет, как-будто в Bitmap ничего не рисовалось, подскажите пожалуйста как справиться с этой проблемой.
  • JohnJ (19.03.08 00:59) [2]
    забыл добавить что GDIPlusInstr это объект класса, производного от TGPGraphics и не делает ничего особо нового (повторю, что в PaintBox всё работает).
  • JohnJ (19.03.08 22:27) [3]
    усё, разобрался ) ошибка в строке
    GDIPlusInstr := TGDIP.Create(Bitmap.Handle);
    надо передавать хэндл на канвас
    GDIPlusInstr := TGDIP.Create(Bitmap.Canvas.Handle); - так работает
  • unknowing (19.03.08 22:49) [4]

    > JohnJ   (19.03.08 22:27) [3]

    Я передаю хэндл на канвас и у меня не работает...
  • Кузан Дмитрий (24.03.08 09:47) [5]
    Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
  • Кузан Дмитрий (24.03.08 09:48) [6]
    Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
  • Кузан Дмитрий (24.03.08 09:48) [7]
    Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
 
Конференция "Media" » Проблемма с GDI+ [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]