2012-09-18 2 views
4

놀랍게도 TCanvas에서 반복적으로 텍스트를 렌더링하는 것이 어떻게 든 "부가 적"이라는 사실을 알게되었습니다. 설정 Canvas.Brush.Style:=bsClear이 문제의 원인이라는 것을 알고 있지만 텍스트를 투명하고 반복적으로 렌더링해야합니다 (예 : OnPaint 이벤트). 이렇게하면 텍스트가 잘 보이지 않습니다.TCanvas에서 "첨가물"텍스트 렌더링?

어떻게 피할 수 있습니까?

다음은 몇 가지 샘플 코드입니다. btn1이라는 TButton을 몇 번 클릭하면 효과를 볼 수 있습니다.

procedure TForm1.btn1Click(Sender: TObject); 
begin 
Form1.Canvas.Brush.Style:=bsClear; //if you omit this, everything is OK. 
Form1.Canvas.Font.Color:=clRed; 
Form1.Canvas.Font.Name:='Times new Roman'; 
Form1.Canvas.Font.Style:=[fsBold]; 
Form1.Canvas.Font.Size:=12; 
Form1.Canvas.TextOut(50,50,'www.stackoverflow.com'); 
end; 
+0

여기서는 Windows 개념 POV에서 매우 잘못 생각합니다. 캔버스는 필요에 따라 다시 그려지는 휘발성입니다. 그것은 영속적이지 않습니다. 양식을 화면 바깥으로 이동하거나 다른 창으로 가져 가면 해당 그림이 지워집니다. Windows 방식을 따르려면 TPaintBox를 사용하고 필요할 때 필요한 것을 그립니다. Windows를 지속적으로 사용하지 않으려면 그림을 유지하기 위해 TImage를 사용하십시오. –

+0

@Arioch> 물론 ...하지만 이것은 매우 간단한 예제입니다 ... 데모 용 – lyborko

+3

클릭 핸들러의 버튼에 페인팅을 중지하고'WM_PAINT'에 대한 응답으로 페인팅을 시작합니다. VCL에서는 일반적으로'TPaintBox'를 사용하여 Win32 API로부터 자신을 보호합니다. 나는'WM_PAINT'에 대한 반응으로 만 페인트를 반복합니다. –

답변

7

그 이유는 GDI가 텍스트를 그릴 때 일부 안티 앨리어싱을 적용하여 텍스트가 더 잘 보이기 때문입니다. 이로 인해 그려진 텍스트 외부의 배경 픽셀 일부가 텍스트 근처에 빨간색/붉은 색으로 칠합니다. 다음에 텍스트를 그릴 때 배경을 지우지 않으면 안티 앨리어싱으로 인해이 붉은 픽셀이 더 빨갛게됩니다.

배경을 answer에 명시된 Arioch 'The으로 지우거나 텍스트를 투명하고 반복적으로 렌더링해야하는 경우 앤티 앨리어싱을 해제 할 수 있습니다.

TOndrej은 텍스트 출력 품질을 지정하기 위해 this answer에서 좋은 기능을 제공합니다. 이 코드를 사용하면 코드는 다음과 같이됩니다.

begin 
Form1.Canvas.Brush.Style:=bsClear; 
Form1.Canvas.Font.Color:=clRed; 
Form1.Canvas.Font.Name:='Times new Roman'; 
Form1.Canvas.Font.Style:=[fsBold]; 
Form1.Canvas.Font.Size:=12; 
SetFontQuality(Form1.Canvas.Font, NONANTIALIASED_QUALITY); // <-- 
Form1.Canvas.TextOut(50,50,'www.stackoverflow.com'); 
end; 
3

렌더링하기 전에 배경을 청소해야합니다.

  • 보통 윈도우는 특별한 신호를주고, WM_ERASEBKGND http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms648055.aspx
  • VirtualTreeView 또는 QuantumTreeList 같은 일부 구성 요소는 셀 배경을 칠하는 특별 이벤트 핸들러가 있습니다. 이러한 메시지가/이벤트가 컨트롤에 의해 노출되지 않는 경우

는, 당신은 마지막으로 렌더링 된 텍스트 TRect (기능 TCanvas.TextExtent 또는 같은)을 기억하고 다음 텍스트를 렌더링하기 전에 청소해야합니다.

때로는 가능하고 더 간단합니다 ("더럽고 추악한"해결 방법의 일종이지만)은 투명한 TLabel을 적절한 위치에 캔버스 위에 놓고 필요할 때 캡션을 변경하는 것입니다.