2011-12-25 51 views

答えて

3

GDIによるアンチエイリアス描画を実現する最も簡単な方法は、より大きなサーフェスに描画し、ハーフトーン対応のストレッチモードを持つ元のサイズに縮小することです。

以下のコード例では、リストボックスのクライアント領域の16倍のビットマップを使用しています(これはかなり大きなビットマップであり、描画を行うのには時間がかかりますが、効果はより簡単に見えるはずです)。アンチエイリアスで描画1 - 左で下の画像に

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があります。私はもちろん、あなたが考慮にダビデの候補の1つを取るために助言する

enter image description here

:テキストはまた、効果のいくつかを得ていることに注意してください。このコードはかなり実験的でした:)

4

アンチエイリアスを行う機能はありません。あなたはGDI +を使うことができますが、私はgraphics32をお勧めします。これは幸いにはanti-aliased polygonsを描くでしょう。

関連する問題