DrawText를 이용하여 고정된 Width를 갖는 TEXTBOX에 DRAW했을 경우에 해당 TEXTBOX의 높이를 알 수 있다.
아래 샘플코드는 DrawText를 이용하여 Wraped된 TEXT를 출력합니다.
procedure TForm1.Button1Click(Sender: TObject); var r: Trect; s: String; begin R := Rect(0,0, 300, 100); s := 'WordWrapTextOut(TargetCanvas: TCanvas; var x, y: integer; S: string; maxwidth, lineheight: integer);'; DrawText(Canvas.Handle, PChar(s), length(s), R, DT_WORDBREAK or DT_LEFT); end;Wraped된 TEXT를 Draw하기 전에 Draw될 사각 영역을 알기 위하여 DrawText 함수내 선택 인자 "DT_CALCRECT"를 이용할 수 있습니다. DrawText는 이 옵션을 사용하여 새로운 사각 영역의 높이를 알 수 있다(넓이도 ...) "DT_CALCRECT" 옵션을 사용할때 함께 주어지는 사각 영역 "R" 값에 입력에는 넓이 값을 지정하게 되고 함수 수행후 R값에는 Bottom 값에 변경된 높이(height)값이 반환되어 들어옵니다. 아래 예문은 먼저 출력될 문자열을 "DT_CALCRECT"를 이용하여 새로운 높이를 알아 낸 다음에 실제로 다시 DrawText를 이용하여 Draw하고 바로 아래 라인에 다시 재 출력하는 예제 입니다.
procedure TForm1.Button1Click(Sender: TObject); var r: Trect; s: String; begin R := Rect(0,0, 300, 100); s := 'WordWrapTextOut(TargetCanvas: TCanvas; var x, y: integer; S: string; maxwidth, lineheight: integer);'; if DrawText(Canvas.Handle, PChar(s), length(s), R, DT_CALCRECT or DT_WORDBREAK or DT_LEFT) <> 0 then begin DrawText(Canvas.Handle, PChar(s), length(s), R, DT_WORDBREAK or DT_LEFT); r.Top := r.Bottom; r.Bottom := r.Bottom * 2; DrawText(Canvas.Handle, PChar(s), length(s), R, DT_WORDBREAK or DT_LEFT); end; end;DrawText함수에 "DT_CALCRECT"플래그를 지정함으로써 실제로는 아무것도 Display 하지 않으면서 실제 출력할 대상 영역에 대한 정보를 변수 "R"에 계산되어 리턴됨을 알 수 있습니다.
procedure TForm1.Button1Click(Sender: TObject); var R: TRect; S: String; begin R := Rect(0, 0, 20, 20); S := 'What might be the new high of this text ?'; DrawText(Canvas.Handle, PChar(S), Length(S), R, DT_WORDBREAK or DT_LEFT or DT_CALCRECT); ShowMessage('New height might be '+IntToStr(R.Bottom - R.Top)+' px'); end;위와 같이 R에 리턴되는 값을 이용하여 아래 예제처럼 두번을 연속해서 다른 플래그를 지정하여 실제 Draw까지 할 수 있습니다
procedure TForm1.Button1Click(Sender: TObject); var R: TRect; S: String; begin R := Rect(0, 0, 20, 20); S := 'Some text which will be stoutly wrapped and painted :)'; DrawText(Canvas.Handle, PChar(S), Length(S), R, DT_WORDBREAK or DT_LEFT or DT_CALCRECT); DrawText(Canvas.Handle, PChar(S), Length(S), R, DT_WORDBREAK or DT_LEFT); end;
'프로그래밍 > Delphi' 카테고리의 다른 글
[Delphi] 현재 어플리케이션이 활성/비활성된 상태 Detect (0) | 2011.10.12 |
---|---|
[Delphi] 듀얼 모니터 인식 및 사용하기 (0) | 2011.10.11 |
TBitmap32는 Thread내에서 Memory Leak이 발생 해법 (0) | 2011.07.25 |
Graphics32에서 TBitmap32를 Thread 내에서 사용했을때의 문제점 추정 (0) | 2011.07.24 |
GDI객체 및 기본 윈도우 메모리 힙 할당문제 (1) | 2011.07.23 |