![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемма с GDI+ [D7, WinXP]
unknowing © (2008-03-15 09:32:00)Всем привет! Вот код класса (примерно):
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?
Кузан Дмитрий (2008-03-24 09:48:00) [1]Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
Кузан Дмитрий (2008-03-24 09:48:00) [2]Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
Кузан Дмитрий (2008-03-24 09:47:00) [3]Так как указатель на объект и указатель на канву - это разные вещи , хотя и обы представлены указателем, то путать их не надо.
unknowing (2008-03-19 22:49:00) [4]
> JohnJ (19.03.08 22:27) [3]
Я передаю хэндл на канвас и у меня не работает...
JohnJ (2008-03-19 22:27:00) [5]усё, разобрался ) ошибка в строке
GDIPlusInstr := TGDIP.Create(Bitmap.Handle);
надо передавать хэндл на канвас
GDIPlusInstr := TGDIP.Create(Bitmap.Canvas.Handle); - так работает
JohnJ (2008-03-19 00:59:00) [6]забыл добавить что GDIPlusInstr это объект класса, производного от TGPGraphics и не делает ничего особо нового (повторю, что в PaintBox всё работает).
JohnJ (2008-03-19 00:57:00) [7]У меня похожая проблема:
Когда делаю прорисовку как в примерах (в 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 ничего не рисовалось, подскажите пожалуйста как справиться с этой проблемой.