TextOut은 한줄만 출력하므로 기능이 너무 단순하다. 이보다 조금 더 복잡한(+기능) 문자열 출력 함수로 DrawText 함수가 있다.
int DrawText(HDC hDC, LPCTSTR lpString, int nCount,LPRECT lpRect, UINT uFormat);
이 함수는 사각형 영역을 정의하여 영역 안에 문자열을 출력할수 있고 여러 가지 포맷을 설정하는 기능이 있다. 윈도우즈에서 사각영역을
정의할 때는 다음과 같이 정의된 RECT 구조체를 사용한다.
typedef struct _RECT{
LONG left;
LONG top;
LONG right;
LONG bottom;
}RECT;
각 인자 설명은 그림으로 보는게 더 빠를것 이다.
단 직사각형만 표현할수 있다.
이제 함수 인자에 대해 설명하겠다.
첫번째 인자는 HDC이다.
두번째 인자가 출력할 문자열
세 번째 인수는 출력할 문자열의 길이이며 이 값이 -1이면 널 종료 문자로 간주
ps:TextOut와 달리 널 종료 문자열을 인식하므로 문자열 상수를 곧바로 출력 할 수 있다. 다섯번째 인수 uFormat은 DrawText 함수가
문자열을 출력할 방법을 지정하는 플래그 아래표는 그 플래그표 이다.
DT_LEFT | 수평 왼쪽 정렬 |
DT_RIGHT | 수평 오른쪽 정렬 |
DT_CENTER | 수평 중앙 정렬 |
DT_BOTTOM | 사각영역의 바닥에 무나열 출력 |
DT_VCENTER | 사각영역의 수직 중앙에 문자열 출력 |
DT_WORDBREAK | 사각영역의 오른쪽 끝에서 자동 개행되도록 한다. |
DT_SINGLELINE | 한 줄로 출력한다. |
DT_NOCLIP | 사각영역의 경계를 벗어나도 문자열을 자르지 않고 그대로 출력한다. |
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_Inst;
LPCTSTR lpzClass=TEXT("GFP DrawText");
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
HDC hdc;
PAINTSTRUCT ps;
RECT rt={100,100,400,300};
TCHAR *str=TEXT("팡야도 잘안되고... 날씨는 덥고.. 냉면은 먹고 싶고.."
"돈은 없고... 배는 부르고"
"우어엉어 비가 내렸으면.... 장마는 빠이빠이.");
switch(iMessage){
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
DrawText(hdc,str,-1,&rt,DT_CENTER|DT_WORDBREAK);
EndPaint(hWnd,&ps);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_Inst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName=lpzClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpzClass,lpzClass,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nShowCmd);
while(GetMessage(&Message,NULL,0,0)){
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
사각영역을 100,100을 기준점으로 가로 세로 400 300끝점으로 하는 영역 -1(문장의 끝을 만날때) 까지 str을 출력 중앙 정렬 및 자동 개행
플래그 사용.
TextOut을 이용해서 여러줄 써도 되지만 그것보다는 DrewText를 이용하면 한줄에 해결!
뭐 그런겁니다..
그런데 TextOut을 더 많이 사용한다!
책에 재미있는게 있어서 적어둔다. 위 코드에서 str 문자열에 아주 긴 문자열을 초기화하기 위해 연속된 문자열을 여러행에 걸쳐 썼다. 이런 초기화가 가능한 이유는 C가 인접한 문자열 상수를 하나로 합치기 때문이다 행 끛에 행 계속 문자인\를 두고 다음 줄 첫 열에 문자열을 계속 적는 방법도 있지만 이방법이 더 깔끔 하다 C를 좀 한다는 사람도 이런 초기화 방법은 잘 모르는 경우는 많은데 알아두면 무척 편리하다. 라고 한다. |
'Computer > Win API' 카테고리의 다른 글
WinApi MessageBox (0) | 2010.07.17 |
---|---|
WinApi 여러가지 출력 (0) | 2010.07.16 |
WinApi DC 예제 (0) | 2010.07.15 |
WinApi 예제1의 확장 (0) | 2010.07.15 |
WinApi 예제 1 (1) | 2010.07.15 |