Форум: "Media";
Текущий архив: 2010.10.03;
Скачать: [xml.tar.bz2];
ВнизПроблемма с GDI+ Найти похожие ветки
← →
unknowing (2008-03-15 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 (2008-03-19 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 (2008-03-19 00:59) [2]забыл добавить что GDIPlusInstr это объект класса, производного от TGPGraphics и не делает ничего особо нового (повторю, что в PaintBox всё работает).
← →
JohnJ (2008-03-19 22:27) [3]усё, разобрался ) ошибка в строке
GDIPlusInstr := TGDIP.Create(Bitmap.Handle);
надо передавать хэндл на канвас
GDIPlusInstr := TGDIP.Create(Bitmap.Canvas.Handle); - так работает
← →
unknowing (2008-03-19 22:49) [4]
> JohnJ (19.03.08 22:27) [3]
Я передаю хэндл на канвас и у меня не работает...
← →
Кузан Дмитрий (2008-03-24 09:47) [5]Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
← →
Кузан Дмитрий (2008-03-24 09:48) [6]Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
← →
Кузан Дмитрий (2008-03-24 09:48) [7]Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2010.10.03;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.003 c