놀랍게도 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;
여기서는 Windows 개념 POV에서 매우 잘못 생각합니다. 캔버스는 필요에 따라 다시 그려지는 휘발성입니다. 그것은 영속적이지 않습니다. 양식을 화면 바깥으로 이동하거나 다른 창으로 가져 가면 해당 그림이 지워집니다. Windows 방식을 따르려면 TPaintBox를 사용하고 필요할 때 필요한 것을 그립니다. Windows를 지속적으로 사용하지 않으려면 그림을 유지하기 위해 TImage를 사용하십시오. –
@Arioch> 물론 ...하지만 이것은 매우 간단한 예제입니다 ... 데모 용 – lyborko
클릭 핸들러의 버튼에 페인팅을 중지하고'WM_PAINT'에 대한 응답으로 페인팅을 시작합니다. VCL에서는 일반적으로'TPaintBox'를 사용하여 Win32 API로부터 자신을 보호합니다. 나는'WM_PAINT'에 대한 반응으로 만 페인트를 반복합니다. –