posted by nsakura 2010. 7. 15. 21:56

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