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값을 가져와야 합니다.
[Windows API for .NET] - GetDesktopWindow - 현재 Windows 화면의 Handle구하기
[Windows API for .NET] - 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#
'.NET > Windows API for .NET' 카테고리의 다른 글
GetBinaryType - 실행 File 유형 확인 (0) | 2019.07.31 |
---|---|
GetWindowRect - Window의 위치및 크기 반환 (0) | 2019.07.31 |
DestroyCursor - Cursor의 제거 (0) | 2019.07.31 |
DrawFrameControl - Frame Control 그리기 (0) | 2019.07.31 |
GetWindowDC - 현재 Windows화면의 Device Context 구하기 (0) | 2019.07.31 |