Delphi:绘制消除锯齿的三角形

问题描述:

如何在ListBoxDrawItem上绘制消除锯齿的三角形?Delphi:绘制消除锯齿的三角形

ListBox.Canvas.Polygon 

绘制有锯齿。

谢谢!

使用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中 - 所述一个抗锯齿绘制。请注意,该文本也已取得了一定的效果:

enter image description here

我当然会建议你采取的大卫的建议之一考虑。这段代码相当实验:)。

没有什么内置的将会做抗锯齿。你可以使用GDI +,但我会建议graphics32,这将很高兴绘制anti-aliased polygons