Форум: "Media";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];
Внизрисование через буфер (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 вся ветка
Форум: "Media";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.048 c