Programming/Windows API
DrawText는 화면상에 지정한 Text 내용을 출력합니다.

Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Integer, ByVal lpStr As String, ByVal nCount As Integer, ByRef lpRect As RECT, ByVal wFormat As Integer) As Integer
▶VB.NET 선언

[DllImport("user32")]
public static extern int DrawText(int hdc, string lpStr, int nCount, ref RECT lpRect, int wFormat);
▶C# 선언

DrawText함수의 첫번째 인수는 문자열을 표시할 장치의 Handle 값을 건네주는 것입니다. 이때 지정한 문자열을 단순히 Windows Monitor화면에 표시하기 위해서는 GetDesktopWindow와 GetWindowDC함수를 통해 Handle값을 가져와야 합니다.

[Develop/Windows API] - GetDesktopWindow - 현재 Windows 화면의 Handle구하기
[Develop/Windows API] - GetWindowDC - 현재 Windows화면의 Device Context 구하기

DrawText 함수의 두번째 인수는 실제로 표시할 문자열의 내용이며 세번째 인수는 표시할 문자열중에서 몇글자까지 표시할 것인지를 정수형태로 지정하면 됩니다. 만일 이 인수를 2로 지정하면 전달한 문자열의 앞에서 부터 단 2글자만 화면에 표시하겠다는 의미가 되는 것이죠.

전달한 문자열이 몇글자인지와는 상관없이 무조건 전체를 표시하기 위해서는 nCount인수를 -1로 지정하면 됩니다.

문자열을 실제 화면에 표시하려면 표시영역을 4각형 형태로 지정해 줘야 합니다. 그래서 다음과 같이 영역을 지정할 Structure를 선언하고 각 위치값을 통해 표시될 영역을 지정해 줘야 합니다.

Public Structure RECT
        Public left As Integer
        Public top As Integer
        Public right As Integer
        Public bottom As Integer
End Structure

Dim f_rect As RECT
f_rect.left = 10
f_rect.top = 10
f_rect.right = 100
f_rect.bottom = 100

▶VB.NET

public struct RECT
{
         public int left;
         public int top;
         public int right;
         public int bottom;
}

RECT f_rect = new RECT();
f_rect.left = 10;
f_rect.top = 10;
f_rect.right = 100;
f_rect.bottom = 100;

▶C#

위 Code는 출력할 화면을 기준으로 왼쪽 10부터 오른쪽 100까지 위쪽 10부터 아래쪽 100까지의 사각형 영역을 그립니다.

마지막 4번째 인수에는 출력할 문자열을 어떠한 형태로 표시할지 지정하는 것으로 다음과 같은 값을 쓸 수 있습니다.

 상수  16진  설명
 DT_BOTTOM  8  표시할 영역의 아래쪽에 문자열 표시
 DT_CALCRECT  400  높이와 넓이를 지정
 DT_CENTER  1  표시할 영역의 중앙에 문자열 표시
 DT_EDITCONTROL  2000  표시할 문자열이 2줄 이상인 경우 구분문자열 무시
 DT_END_ELLIPSIS  4000  만일 문자열이 표시할 영역을 벗어나면 ...단축형태로 표시함(DT_MODIFYSTRING가 같이 지정되어야 함)
 DT_EXPANDTABS  40  TAB문자 표시
 DT_EXTERNALLEADING  200  -
 DT_HIDEPREFIX  10000  & 문자 무시
 DT_INTERNAL  1000  -
 DT_LEFT  0  표시할 영역의 왼쪽에 문자열 표시
 DT_MODIFYSTRING  10000  지정된 형태로 문자열 수정(DT_END_ELLIPSIS가 같이 지정되어야 함)
 DT_NOCLIP  100  문자열 모두 표시(잘리는 현상을 방지)
 DT_NOFULLWIDTHCHARBREAK  800000  -
 DT_NOPREFIX  800  -
 DT_PREFIXONLY  200000  & 문자뒤에 밑줄처리
 DT_RIGHT  2  표시할 영역의 오른쪽에 문자열 표시
 DT_RTLREADING  20000  표시되는 글꼴이 아랍어일 경우 문자열을 왼쪽에서 오른쪽 순으로 바꿈
 DT_SINGLELINE  20  한줄표시
 DT_TABSTOP    TAB정지
 DT_TOP  0  표시할 영역의 위쪽에 문자열을 표시
 DT_VCENTER  4  표시할 영역의 중앙에 문자열을 표시하되 수직으로 배치
 DT_WORDBREAK  10  -

위 상수들은 VB.NET에서 or로 C#에서 | 문자로 여러상수가 동시에 쓰일 수 있으나 DT_CALCRECT, DT_EXTERNALLEADING, DT_INTERNAL, DT_NOCLIP 또는 DT_NOPREFIX, DT_TABSTOP 상수는 서로간의 기능상 충돌로 인해 효과가 나타나지 않을 수 있습니다.

위 인수를 토대로 실제 화면에 Hello! 문자열을 표시하도록 함수를 호출한 예제는 다음과 같습니다.

DrawText(GetWindowDC(GetDesktopWindow()), "Hello!", 2, f_rect, &H1)
▶VB.NET

DrawText(GetWindowDC(GetDesktopWindow()), "Hello!", 2, ref f_rect, 0x1);
▶C#
0 0