2011년8월24일_winAPI_TextOut(), MyTextOut(), SetTextAlign(), DrawText()

 

복습...

● DC(Device Context) : 화면에 출력할 때 쓰는 구조체
● DC얻기: GetDC( ), BeginPaint( )
● DC해제: ReleaseDC( ), EndPaint( )

 

GetDC( )

BeginPaint( )

내용보존

window를 가리면 내용이 지워짐 지워지면 다시 그림

메시지

모든 메시지내에서 사용가능 WM_PAINT 내에서만 사용가능

속도

느리다 빠르다



1. TextOut( )

   1: //          DC핸들, 표시할 좌표 x, y            ,  출력할 문자열,   문자수
   2: BOOL TextOut(HDC hdc, int nXStart, int nYStart, LPCTSTR lpString, int cbString);

① hdc: DC핸들, 화면에 표시하기 위해 장치에 접근해야 한다. 파일디스크립터와 비슷하게 DC 구조체를 운영체제로부터 받는다.
② nXStart: 화면에 표시할 문자열의 시작좌표 x축
③ nYStart: 화면에 표시할 문자열의 시작좌표 y축
④ lpString: 화면에 표시할 문자열
⑤ cbString: lpString의 문자수

   1: TCHAR *str = TEXT("Beautiful Korea");        //포인터변수str이 문자열을 가리키도록함.
   2: TextOut(hdc, 100, 100, str, lstrlen(str));   /*window의 100,100에 문자열출력*/

문자수의 경우 유니코드문제로 바이트수계산이 어려우니 lstrlen( )를 사용해 계산한다.

TextOut( )의 네 번째 인자는 문자열만 취급하고 printf( )처럼 형식지정자를 쓸 수 없으므로..
sprintf( )나 wsprintf( )로 서식화한 뒤에 서석화된 문자열을 출력한다.
wsprintf( )는 API함수이므로 용량상의 불이익이 없고(무슨 말이지? 문자열의 크기를 크게 넘겨줄 수 있다는 건가?)
유니코드를 지원한다는 장점이 있기는 하지만 실수를 서식화할 수 없고, 
버퍼 길이가 1024까지만 지원되는 단점이 있다. (용량상 불이익이 없다고 해놓고선 무슨 말이냐?)
실수는 sprintf 표준 함수나 유니코드 버전의 swprintf를 사용해야 한다. 

   1: TCHAR str[100];    //서식화된 문자열이 저장될 버퍼
   2: int Score = 100;
   3: wsprintf(str, TEXT("점수는 %d입니다."), Score);    //서식화
   4: MyTextOut(hdc, 100, 100, str);  
window의 (100, 100)에 서식화된 문자열 “점수는 100입니다.”를 출력.



2. MyTextOut( )   - 사용자정의함수

   1: // DC핸들,  x축, y축, 화면에 표시할 문자열
   2: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text)
   3: {
   4:     TextOut(hdc, x, y, Text, lstrlen(Text));
   5: }
   6:  
   7: //사용법
   8: MyTextOut(hdc, 100, 100, TEXT("Beautiful Korea"));

TextOut( )는 문자수를 호출시에 꼭 넘겨줘야 하니 문자수를 빼고 사용하기 편리하게 만든 함수.

image 



3. SetTextAlign( )

hdc의 정보를 변경하면 문자의 모양이나 크기, 색상, 정렬 상태, 좌표 해석 방법 등의 여러 가지 변화를 줄 수 있는데..
SetTextAlign( )를 사용해 간단하게 정렬 상태를 변경해보자.

   1: //                 DC핸들, 정렬모드
   2: UINT SetTextAlign(HDC hdc, UINT fMode);

첫 인수로 DC의 핸들, 두 번째 인수로 정렬정보를 받아 리턴 후 다음 출력명령으로 출력되는 문자열들을 정렬한다.

fMode값 설명
TA_TOP 지정한 좌표가 상단 좌표가 된다.
TA_BOTTOM 지정한 좌표가 하단 좌표가 된다.
TA_CENTER 지정한 좌표가 수평중앙 좌표가 된다.
TA_LEFT 지정한 좌표가 수평왼쪽 좌표가 된다.
TA_RIGHT 지정한 좌표가 수평오른쪽 좌표가 된다.
TA_UPDATECP 지정한 좌표대신 CP를 사용하여 출력후 CP를 변경한다.
TA_NOUPDATECP CP를 사용하지 않고 지정좌표를 사용하여 출력후 CP변경x

DC를 얻오 오면 디폴트상태로 TA_TOP | TA_LEFT로 설정되어 있다.

● TA_UPDATECP: 좌표를 무시하고 CP(Current Position, 다음 그래픽이 출력될 위치저장) 위치에 출력 후 위치(CP)를 갱신.


<예제코드>

   1: case WM_PAINT:                //윈도우에 변화가 일어나면 (모든)
   2:     hdc = BeginPaint(hWnd, &ps);    //DC를 얻음.
   3:  
   4:     //strlen을 이용한 문자수계산.
   5:     str = TEXT("Beautiful Korea");
   6:     TextOut(hdc, 100, 100, str, lstrlen(str));    //문자열 출력
   7:     
   8:     str = TEXT("test");
   9:     TextOut(hdc, 100, 120, str, lstrlen(str));    //문자열 출력
  10:  
  11:     //MyTextOut함수사용.
  12:     MyTextOut(hdc, 100, 140, TEXT("HaHaHa"));
  13:     MyTextOut(hdc, 100, 160, TEXT("I like a bob"));
  14:  
  15:     SetTextAlign(hdc, TA_LEFT);
  16:     MyTextOut(hdc, 400, 200, TEXT("수만이는 배고프다."));
  17:     MyTextOut(hdc, 400, 220, TEXT("매일매일 배고파"));
  18:     MyTextOut(hdc, 400, 240, TEXT("그래서 매일 밥을 먹고 있다 ^ㅡ^"));
  19:  
  20:     SetTextAlign(hdc, TA_RIGHT);
  21:     MyTextOut(hdc, 400, 300, TEXT("수만이는 배고프다."));
  22:     MyTextOut(hdc, 400, 320, TEXT("매일매일 배고파"));
  23:     MyTextOut(hdc, 400, 340, TEXT("그래서 매일 밥을 먹고 있다 ^ㅡ^"));
  24:  
  25:     SetTextAlign(hdc, TA_UPDATECP);
  26:     MyTextOut(hdc, 400, 400, TEXT("수만이는 배고프다."));
  27:     MyTextOut(hdc, 400, 420, TEXT("매일매일 배고파"));
  28:     MyTextOut(hdc, 400, 440, TEXT("그래서 매일 밥을 먹고 있다 ^ㅡ^"));
  29:  
  30:     Score = 85;
  31:     wsprintf(str1, TEXT("현재 점수는 %d점입니다."), Score);
  32:     MyTextOut(hdc, 400, 500, str1);
  33:  
  34:     EndPaint(hWnd, &ps);    //DC해제
  35:     return 0;


image 




4. DrawText( )

TextOut( )보다 기능이 많은 함수로 puts( )와 같이 문자열의 끝을 인식하여 출력할 수도 있다.


참조(Reference)


DSCN3988DSCN3995 DSCN3996 DSCN3997