Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.07.08;
Скачать: CL | DM;

Вниз

рисование через буфер (GDI+)   Найти похожие ветки 

 
Tab   (2006-10-19 09:37) [0]

Хочу рисовать на битмапе, потом уже копировать на graphics. Что не так делаю?

 graphics_buf:=TGPGraphics.Create();
 bitmap:=TGPBitmap.Create(320,400,graphics_buf);

 graphics := TGPGraphics.Create(Form1.PaintBox1.Canvas.Handle);
 pen:= TGPPen.Create(MakeColor(255, 0, 0, 255));
 graphics_buf.DrawLine(pen, 0, 0, 200, 100);
 graphics.drawImage(bitmap, 10, 10);
 graphics.Free;
 pen.Free;


 
Ricks ©   (2006-10-19 17:49) [1]

Попробуй создать временный DC и на нем создавать TGPGraphics.
А вообще посмотри, как еще можно создавать TGPGraphics - скорее всего проблема в этом!


 
Tab   (2006-10-22 08:23) [2]

примерчик бы.


 
SamBrook ©   (2006-10-22 18:54) [3]


> Хочу рисовать на битмапе, потом уже копировать на graphics.

Просто включите двойную буферизацию и рисуйте как обычно. Эффект будет тот же.


 
Tab   (2006-10-23 12:50) [4]


> Просто включите двойную буферизацию и рисуйте как обычно.

как ее включить?


 
Tab   (2006-10-23 12:50) [5]

Сделал следующим образом:
procedure MakeMeta;
var
i: integer;
begin
 metafile := TGPMetaFile.Create(Form1.PaintBox1.Canvas.Handle,EmfTypeEmfPlusDual);
 graphics_buf2:=TGPGraphics.Create(metafile);
 if Form1.CheckBox2.Checked then
 graphics_buf2.SetSmoothingMode(SmoothingModeHighQuality);
 graphics_buf2.FillRectangle(br,0,0,400,300);
 for i:=1 to ObjCount_l do
 begin
       Lr[i].Draw(graphics_buf2);
 end;
 graphics_buf2.free;
end;
procedure Draw;
var
 i: integer;
begin
 graphics := TGPGraphics.Create(Form1.PaintBox1.Canvas.Handle);
 graphics.DrawImage(metafile,0,0,delta_x,delta_y,400,300,UnitPixel);
 graphics.Free;
end;
MakeMeta вызываю только один раз при создании metafile a draw потом при обовлении PaintBox в MouseMove.
Вот при MouseMove начинается мерцание.


 
Ricks ©   (2006-10-23 12:56) [6]

Попробуй так:

var G   : TGPGraphics;
   aDC : HDC;
   aBM : HBITMAP;
begin
aDC:=CreateCompatibleDC(0);
aBM:=CreateCompatibleBitmap(Message.DC, ClientWidth, ClientHeight);
SelectObject(aDC, aBM);
G:=TGPGraphics.Create( aDC );
G.SetInterpolationMode( InterpolationModeNearestNeighbor );
try
 if Transparent then DrawThemeParentBackground(Handle, aDC, nil);
 RenderWindow( G, MakeRect(0, 0, Pred(ClientWidth), Pred(ClientHeight) ), aDC );
 BitBlt(Message.DC, 0, 0, ClientWidth, ClientHeight, aDC, 0, 0, SRCCOPY);
finally
 G.Free;
 DeleteObject( SelectObject(aDC, 0) );
 DeleteObject(aBM);
 DeleteDC(aDC);
end;


У меня это стоит на WMEraseBackground


 
Ricks ©   (2006-10-23 12:58) [7]

Это я делал отдельный control, но принцип такой-же:
• создаешь bitmap
• на нем создаешь DC, на этом DC создаешь TGPGraphics
• рисуешь
• BitBlt на нужный DC
• Удаляешь все на...


 
Tab   (2006-10-23 13:16) [8]

один вопрос, если на Bitmap рисуются фигуры, линии квадртаты, потом когда я увеличиваю изображение оно малость "портится", пытался обойти это рисуя на metafile, но что-то не очень.
Есть какой-нибудь способ стобы при увеличении линии оставались такими-же?


 
SamBrook ©   (2006-10-23 22:18) [9]

Двойную буфферизацию включить не просто а очень просто
для наследников tWinControl  DoubleBuffered:=true
для tgraphicContol - parent.DoubleBuffered:=true.

Собстенно все что Вы пытаетесь сделать и есть двойная буферизация.



Страницы: 1 вся ветка

Текущий архив: 2007.07.08;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
1-1178626483
nali
2007-05-08 16:14
2007.07.08
Освобождение ресурсов потока


15-1181125978
Nic
2007-06-06 14:32
2007.07.08
Nokia 6080


15-1180993364
IMHO
2007-06-05 01:42
2007.07.08
Данные на дисках обречены...


1-1178188788
Domkrat
2007-05-03 14:39
2007.07.08
Многоязыковая поддержка


3-1176277194
elserpiente
2007-04-11 11:39
2007.07.08
ADO+ODBC Firebird