Window API에서 처음 문자열 출력을 할때 당황하지 않을 수 없었습니다.
도스 콘솔 시절에서 사용했던 printf 또는 std::cout 같은 함수를 사용하다가 출력 좌표와 HDC 값등..추가된 부분이 너무 많기 때문입니다..
또한 유니코드와 멀티바이트등의 구분 또한 간단하게 문자 또는 문자열을 출력하고 싶은 작성자에 멘탈을 공격하기에 충분했습니다...
아무튼 Window API에서 제공하는 문자출력 방법에 대해서 알아보도록 하겠습니다.
TextOut
: 현재 선택된 폰트 , 배경색 및 글자색을 사용하여 지정된 위치에 문자 스트링을 기록하는 함수합니다.
BOOL TextOut( _In_ HDC hdc, _In_ int nXStart, _In_ int nYStart, _In_ LPCTSTR lpString, _In_ int cchString ); |
매게 변수 | 의미 |
hdc | Device Context(DC)의 핸들값 |
nXStart | 문자열을 정렬하기 위한 기준점.(논리 좌표에서 X 좌표) |
nYStart | 문자열을 정렬하기 위한 기준점.(논리 좌표에서 Y 좌표) |
lpString | 출력하려고 하는 문자열에 대한 포인터 |
cchString | 문자열의 길이 (반드시 길이 값을 넣어야 한다.) |
LRESULT CALLBACK WndProc(HWND hWnd , UINT Imessage , WPARAM wParam , LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(Imessage)
{
case WM_PAINT :
{
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 100, 100, TEXT("Hello Wor!!"), 13); //또는 L"Hello Word!!"
EndPaint(hWnd , &ps);
break;
}
case WM_DESTROY :
{
PostQuitMessage(0);
break;
}
}
return DefWindowProc(hWnd , Imessage , wParam , lParam);
}
가능하면 윈도우에서 문자열은 유니코드를 사용하여 코딩하는 것이 좋습니다..
위에서 문자열에 TEXT("문자열")로 해도 되고 L"문자열"로 해도 출력 결과는 같습니다.
TEXT("")와 L 두개의 차이점은 L의 경우 멀티바이트를 유니코드로 변경해주지만,
추후 다시 멀티바이트로 변경시 해당하는 부분에 L을 모두 제거해야 됩니다.(노가다)도 됩니다.
TEXT("문자열")을 사용하게 되면 멀티바이트 환경에서는 자동으로 ""으로 유니코드에서는 L""으로 컴파일 됩니다.
만약 문자열 사이즈에 변동이 생기고 정확한 길이를 확인 할 수 없다면, 아래와 같이 지정해도 됩니다.
TCHAR *str = TEXT("Hello Wordl!!");
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 100, 100, str, wcslen(str) );
EndPaint(hWnd , &ps);
break;
여기서 TCHAR은 wchar_t으로 유니코드 문자입니다.
즉 유니코드 문자열(포인터)를 선언하였으며, wchar_t* 형이니 유니코드 TEXT("")를 통해 문자열을 입력,
wcslen으로 해당 문자열에 사이즈를 구해 그 만큼의 값을 출력하게 하였습니다.
wsprintf
: 인수 및 문자열에 대응하는 포맷 사양에 따라 출력 버퍼로 변환 및 복사됩니다.
콘솔 시절에 printf와 비슷하지만 독자적으로 출력할 수는 없습니다. (아쉽...) 리턴 값은 글자 수의 널 종료문자를 포함하지 않습니다.
int __cdecl wsprintf( _Out_ LPTSTR lpOut, _In_ LPCTSTR lpFmt, _In_ ... ); |
매게 변수 | 의미 |
lpOut | 형식화되어 출력될 버퍼입니다. 최대 길이는 1,024 bytes 입니다. |
lpFmt | 문자열을 입력할 수 있습니다. 서식을 포함할 수 있습니다. |
.... | 서식 문자열에 서식과 대응될 변수들을 서식의 갯수만큼 입력할 수 있습니다. |
LRESULT CALLBACK WndProc(HWND hWnd , UINT Imessage , WPARAM wParam , LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR lpOut[1024];
int num = 1;
switch(Imessage)
{
case WM_PAINT :
{
hdc = BeginPaint(hWnd, &ps);
wsprintf(lpOut,TEXT("%d 과 %d 사이에는 %d가 있습니다."), num, num+2 , num+1);
TextOut(hdc,10 ,20 ,lpOut,lstrlen(lpOut));
EndPaint(hWnd , &ps);
break;
}
case WM_DESTROY :
{
PostQuitMessage(0);
break;
}
}
return DefWindowProc(hWnd , Imessage , wParam , lParam);
}
[기타]
DrawText 등등..
'프로그래밍 관련 > Win API' 카테고리의 다른 글
WIndows API - #8. 충돌 처리 (사각형 , 원형 , 마우스) - 작성 중.. (0) | 2015.09.01 |
---|---|
WIndows API - #7. 키보드, 마우스 입력, 좌표 (InvalidateRect) (0) | 2015.09.01 |
WIndows API - #5. 윈도우 문자열 (0) | 2015.08.24 |
WIndows API - #4. 윈도우창 출력 함수 자세히보기(2) (0) | 2015.08.23 |
WIndows API - #4. 윈도우창 출력 함수 자세히보기(1) (0) | 2015.08.23 |