2011년8월24일_winAPI_TextOut(), MyTextOut(), SetTextAlign(), DrawText()
복습...
● DC(Device Context) : 화면에 출력할 때 쓰는 구조체
● DC얻기: GetDC( ), BeginPaint( )
● DC해제: ReleaseDC( ), EndPaint( )
GetDC( ) | BeginPaint( ) | |
내용보존 | window를 가리면 내용이 지워짐 | 지워지면 다시 그림 |
메시지 | 모든 메시지내에서 사용가능 | WM_PAINT 내에서만 사용가능 |
속도 | 느리다 | 빠르다 |
1. TextOut( )
① hdc: DC핸들, 화면에 표시하기 위해 장치에 접근해야 한다. 파일디스크립터와 비슷하게 DC 구조체를 운영체제로부터 받는다.
② nXStart: 화면에 표시할 문자열의 시작좌표 x축
③ nYStart: 화면에 표시할 문자열의 시작좌표 y축
④ lpString: 화면에 표시할 문자열
⑤ cbString: lpString의 문자수
문자수의 경우 유니코드문제로 바이트수계산이 어려우니 lstrlen( )를 사용해 계산한다.
TextOut( )의 네 번째 인자는 문자열만 취급하고 printf( )처럼 형식지정자를 쓸 수 없으므로..sprintf( )나 wsprintf( )로 서식화한 뒤에 서석화된 문자열을 출력한다.
wsprintf( )는 API함수이므로 용량상의 불이익이 없고(무슨 말이지? 문자열의 크기를 크게 넘겨줄 수 있다는 건가?)
유니코드를 지원한다는 장점이 있기는 하지만 실수를 서식화할 수 없고,
버퍼 길이가 1024까지만 지원되는 단점이 있다. (용량상 불이익이 없다고 해놓고선 무슨 말이냐?)
실수는 sprintf 표준 함수나 유니코드 버전의 swprintf를 사용해야 한다.
window의 (100, 100)에 서식화된 문자열 “점수는 100입니다.”를 출력.
2. MyTextOut( ) - 사용자정의함수
TextOut( )는 문자수를 호출시에 꼭 넘겨줘야 하니 문자수를 빼고 사용하기 편리하게 만든 함수.
3. SetTextAlign( )
hdc의 정보를 변경하면 문자의 모양이나 크기, 색상, 정렬 상태, 좌표 해석 방법 등의 여러 가지 변화를 줄 수 있는데..
SetTextAlign( )를 사용해 간단하게 정렬 상태를 변경해보자.
첫 인수로 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)를 갱신.
<예제코드>
4. DrawText( )
TextOut( )보다 기능이 많은 함수로 puts( )와 같이 문자열의 끝을 인식하여 출력할 수도 있다.
참조(Reference) |