Delphi:绘制消除锯齿的三角形
答
使用GDI实现消除锯齿绘图的最简单方法是绘制到较大的曲面,然后缩放到具有半色调启用伸展模式的原始尺寸。
下面的代码示例使用16倍大的位图,然后是列表框的客户区(这是一个相当大的位图,它需要很长的时间才能完成绘图,但效果应该更容易)。
procedure TForm1.Button1Click(Sender: TObject);
const
ZOOM = 16;
var
Bmp: TBitmap;
StretchMode: Integer;
begin
// for comparison
ListBox2.Canvas.Polygon([Point(20, 10), Point(10, 50), Point(80, 30)]);
Bmp := TBitmap.Create;
// create a large bitmap and set coordinate extents accordingly
Bmp.SetSize(ListBox1.ClientWidth * ZOOM, ListBox1.ClientHeight * ZOOM);
SetMapMode(Bmp.Canvas.Handle, MM_ISOTROPIC);
SetWindowExtEx(Bmp.Canvas.Handle, 100, 100, nil);
SetViewportExtEx(Bmp.Canvas.Handle, 100 * ZOOM, 100 * ZOOM, nil);
// without halftone we won't gain anything
SetStretchBltMode(Bmp.Canvas.Handle, HALFTONE);
// transfer what's on the list box to bitmap canvas
BitBlt(Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height,
ListBox1.Canvas.Handle, 0, 0, SRCCOPY);
Bmp.Canvas.Polygon([Point(20, 10), Point(10, 50), Point(80, 30)]);
// transfer bitmap contents
StretchMode := SetStretchBltMode(ListBox1.Canvas.Handle, HALFTONE);
StretchBlt(ListBox1.Canvas.Handle, 0, 0,
ListBox1.ClientWidth * ZOOM, ListBox1.ClientHeight * ZOOM,
Bmp.Canvas.Handle, 0, 0, Bmp.Width, Bmp.Height, SRCCOPY);
SetStretchBltMode(ListBox1.Canvas.Handle, StretchMode);
Bmp.Free;
end;
在下面的图片,在左边是ListBox1中 - 所述一个抗锯齿绘制。请注意,该文本也已取得了一定的效果:
我当然会建议你采取的大卫的建议之一考虑。这段代码相当实验:)。