2011-12-25 5 views

답변

3

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

나는 물론 계정으로 다윗의 제안 중 하나를 수행 할 수 권합니다. 이 코드는 다소 실험적이었습니다. :)

4

앤티 앨리어싱을 수행 할 기능이 없습니다. GDI +를 사용할 수 있지만 을 기꺼이 그리는 graphics32을 권하고 싶습니다.