-
Всем привет! Вот код класса (примерно):
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?
-
У меня похожая проблема: Когда делаю прорисовку как в примерах (в 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 ничего не рисовалось, подскажите пожалуйста как справиться с этой проблемой.
-
забыл добавить что GDIPlusInstr это объект класса, производного от TGPGraphics и не делает ничего особо нового (повторю, что в PaintBox всё работает).
-
усё, разобрался ) ошибка в строке GDIPlusInstr := TGDIP.Create(Bitmap.Handle); надо передавать хэндл на канвас GDIPlusInstr := TGDIP.Create(Bitmap.Canvas.Handle); - так работает
-
> JohnJ (19.03.08 22:27) [3]
Я передаю хэндл на канвас и у меня не работает...
-
Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
-
Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
-
Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
|