본문 바로가기
코스웨어

20151113 윤재희 #2 기본창의 다양한 변경, 문자열 출력

by 알 수 없는 사용자 2015. 11. 13.
728x90
반응형

==================================Outline====================================

기본창의 다양한 변경

- 창 바꾸기

- 윈도우 스타일

문자열 출력

- WM_PAINT 메시지

- TextOut

- DrawText

----------------------------------------------------------------------------

 기본창의 다양한 변경

 

http://soen.kr/

 

 

WinAPI 기본형 코드에서 창 내부 색을 바꿔보자.

 

WndClass.hbrBackground=GetStockObject(WHITE_BRUSH);

 

 

 

커서의 모양도 바꿔보자.

 

설명

IDC_ARROW

화살표 모양

IDC_CROSS

십자 모양

IDC_IBEAM

I자 모양

IDC_NO

원안에 빗금이 쳐진 모양

IDC-WAIT

모래시계 모양

 

WndClass.hCursor = LoadCursor(NULL, IDC_CROSS);

 

모양대로 바뀐다.

 

// 커서는 캡쳐되지 않음으로 캡쳐화면은 넘긴다.

 

 

창 제목을 바꿔보자

 

LPSTR lpszClass = L"Hello World!!!"

 

 

창의 제목을 입력할 때 ‘=’ 우측에 아무것도 삽입하지 않으면 사용자가 원하지 않는 문자가 출력된다. 컴퓨터 사양이 향상되면서 표현하는 데이터가 1byte 아스키코드가 아니라 2byte 유니코드로 인식하게 된다.

 

해결 방법은 세가지이다.

 

1. LPSTR lpszClass = L"Hello World!!!";

 

2. LPSTR lpszClass = TEXT("Hello World!!!"); //win32

 

2. LPSTR lpszClass = _T("Hello World!!!"); //MFC

 

창 크기 바꾸기


CreateWindow 함수의 4 ~ 7 번의 함수의 크기를 바꿔준다. 순서는 가로, 세로이다.

 

hWnd = CreateWindow(lpszClass,

lpszClass, //창의제목

WS_OVERLAPPEDWINDOW, //창의속성값지정

100, //가로, 세로시작점(X, Y좌표)

100,

50, //가로, 세로크기(X, Y좌표)

200,

NULL,

(HMENU)NULL,

hInstance,

NULL);

 

윈도우 스타일

 

hWnd = CreateWindow(lpszClass,

lpszClass, //창의제목

//WS_OVERLAPPED |

//WS_CAPTION |

//WS_SYSMENU |

WS_THICKFRAME |

WS_MINIMIZEBOX |

WS_MAXIMIZEBOX |

WS_VSCROLL |

WS_HSCROLL, //창의 속성 값 지정

100, //가로, 세로시작점(X, Y좌표)

100,

200, //가로, 세로크기(X, Y좌표)

250,

NULL,

(HMENU)NULL,

hInstance,

NULL);

문자열 출력

 

DC(Device Context): DC(Device Context)란 출력에 필요한 모든 정보를 가지는 데이터 구조체이며 GDI 모듈에 의해 관리된다. 장치의 상태를 저장하는 것을 일컫는다. Device는 그래픽에 관한 장치를 말한다.

 

과거 핸드폰 게임은 핸드폰 화면에 크기에 맞게 설정되어야만 동작이 되었다. 핸드폰 화면의 크기가 바뀌면 같은 게임이라도 화면크기에 맞춰서 다시 컴파일해야 한다는 단점이 있었다. Java로 게임을 개발하게 되면 가상 머신이 출력화면에 맞게 화면을 변환한 후 출력해준다. 하지만 각 화면에 맞게 최적화되지는 못한다.

 

선을 하나 그을 때도 선의 굵기와 색, 시작점과 끝점 등 여러 가지 정보가 필요하다. 선을 한번 그을 때 마다 모든 정보를 입력하기에 많은 시간이 소요되기 때문에 기본적인 정보를 설정해놓고 바꾸고 싶은 인자의 데이터만 수정해주는 식으로 선을 그으면 작업이 간단해진다.

 

윈도우에서 여러 개의 창이 있을 경우 겹쳐진 부분의 뒷 창은 그릴 필요가 있다. DC는 화면의 출력할 내용을 판단하는 기능을 한다.

 

버튼을 눌렀을 때 문자열을 출력하는 코딩을 해보자.

 

TextOut(hdc,100,100, L"안녕하세요",5);

첫 번째 글자는 현재 저장된 DC의 값, 두 번째 인자는 창의 좌측 상단 꼭지에서 X축으로 얼마나 이동한 거리에 문자를 출력할 것인지를 설정한다. 세 번째 인자는 출력할 문자, 네 번째 인자는 글의 숫자이다.

 

마우스 클릭의 신호를 입력하는 방법(상승에지, 하강에지 등)을 알아야 한다.

 

창을 내리거나 축소, 확대하면 글자가 지워진다.

 

 

WM_PAINT 메시지

 

출력된 화면이 지워지는 경우 이것을 다시 그려주어야 한다. 이 때 사용되는 함수가 WM_PAINT이다.

 

PAINTSTRUCT ps;

HDC hdc;

 

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

TextOut(hdc, 100, 100, L"Beautiful Mind", 14);

EndPaint(hWnd, &ps);

return 0;

 

TextOut

 

BOOL TextOut(hdc, nXStart, nYStart, lpszString, cbString) // == printf

 

첫번째 인수는 당연히 DC의 핸들인 hdc이다. 이 함수뿐만 아니라 화면에 무엇인가를 출력하는 모든 함수들의 첫번째 인수는 항상 hdc이다. TextOut 함수는 널종료 문자열을 사용하지 않으므로 문자열의 길이를 인수로 반드시 밝혀주어야 한다.

 

문자열의 정렬 방법을 변경하는 함수는 SetTextAlign이라는 함수이다.

 

UINT SetTextAlign(HDC hdc,UINT fMode);

 

SetTextAlign(hdc, TA_CENTER);

 

설명

TA_TOP

지정한 좌표가 상단좌표가 된다.

TA_BOTTOM

지정한 좌표가 하단 좌표가 된다.

TA_CENTER

지정한 좌표가 수평 중앙 좌표가 된다.

TA_LEFT

지정한 좌표가 수평 왼쪽 좌표가 된다.

TA_RIGHT

지정한 좌표가 수평 오른쪽 좌표가 된다.

TA_UPDATECP

지정한 좌표대신 CP를 사용하며 문자열 출력후에 CP를 변경한다.

TA_NOUPDATACP

CP를 사용하지 않고 지정한 좌표를 사용하며 CP를 변경하지 않는다.

 

 

DrawText

 

TextOut는 너무 단순하다. 이보다 조금 더 복잡한(=기능이 많은) 문자열 출력 함수로 DrawText라는 함수가 있다.

 

int DrawText( HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat );

 

이 함수는 사각영역을 정의하여 영역안에 문자열을 출력할 수 있으며 여러가지 포멧을 설정할 수 있는 기능이 있다. 윈도우즈에서 사각영역을 정의할 때는 RECT구조체를 사용하며 다음과 같이 정의되어 있다.

 

typedef struct _RECT { // rc

LONG left;

LONG top;

LONG right;

LONG bottom;

} RECT;

 

설명

DT_LEFT

수평 왼쪽 정렬한다.

DT_RIGHT

수평 오른쪽 정렬한다.

DT_CENTER

수평 중앙 정렬한다.

DT_BOTTOM

사각 영역의 바닥에 문자열을 출력한다.

DT_VCENTER

사각 영역의 수직 중앙에 문자열을 출력한다.

DT_WORDBREAK

사각영역의 오른쪽 끝에서 자동 개행되도록 한다.

DT_SINGLELINE

한줄로 출력한다.

DT_NOCLIP

사각 영역의 경계를 벗어나도 문자열을 자르지 않고 그대로 출력한다.


** 글자 깨진다. 수정해야 한다.


/*** 소스 파일 ***/


main.c

 

728x90