2 1 HDC hdc PAINTSTRUCT ps switch i

  • Slides: 46
Download presentation

2 -1 출력할 영역 얻어오기 HDC hdc ; PAINTSTRUCT ps ; switch (i. Msg)

2 -1 출력할 영역 얻어오기 HDC hdc ; PAINTSTRUCT ps ; switch (i. Msg) { case WM_CREATE: break; case WM_PAINT: hdc = Begin. Paint (hwnd, &ps) ; Text. Out(hdc, 0, 0, ”Hello. World”, 10); End. Paint (hwnd, &ps) ; break; case WM_DESTROY: Post. Quit. Message (0) ; break; } 7/211

박스영역에 텍스트 출력 함수 • int Draw. Text( HDC hdc, LPCSTR lp. String, int

박스영역에 텍스트 출력 함수 • int Draw. Text( HDC hdc, LPCSTR lp. String, int n. Length, LPRECT lp. Rect, // 문자열 사각형 구조체 UINT Flags ); 11/211

박스영역 typedef struct tag. RECT { LONG left; // x 1 LONG top; //

박스영역 typedef struct tag. RECT { LONG left; // x 1 LONG top; // y 1 LONG right; // x 2 LONG bottom; // y 2 (x 1, y 1) } RECT; (x 2, y 2) 12/211

2 -2 Draw. Text() 사용 예 HDC hdc ; PAINTSTRUCT ps ; RECT rect;

2 -2 Draw. Text() 사용 예 HDC hdc ; PAINTSTRUCT ps ; RECT rect; switch (i. Msg) { case WM_CREATE : break ; case WM_PAINT : hdc = Begin. Paint (hwnd, &ps) ; rect. left = 50; // 사각형 정의 rect. top = 70; rect. right = 500; rect. bottom = 400; Draw. Text(hdc, "Hello. World", 10, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); // 한 라인, 수직/수평 중앙 End. Paint (hwnd, &ps) ; break ; 13/211

2 -3 키보드 눌렀을 때 출력처리 HDC hdc ; PAINTSTRUCT ps ; switch (i.

2 -3 키보드 눌렀을 때 출력처리 HDC hdc ; PAINTSTRUCT ps ; switch (i. Msg) { case WM_CREATE: break; case WM_KEYDOWN: // 어떤 키라도 누르면 처리 hdc = Get. DC(hwnd); Text. Out(hdc, 0, 0, ”Hello. World”, 10); Release. DC(hwnd, hdc); break; case WM_DESTROY: Post. Quit. Message (0) ; break; } 16/211

입력된 한 문자 출력 HDC hdc ; PAINTSTRUCT ps ; char str[100]; switch (i.

입력된 한 문자 출력 HDC hdc ; PAINTSTRUCT ps ; char str[100]; switch (i. Msg) { case WM_CREATE : return 0 ; case WM_CHAR: hdc = Get. DC(hwnd); str[0] = w. Param; // 입력문자 : : Win. Proc의 매개변수로 들어 옴 str[1] = ''; Text. Out(hdc, 0, 0, strlen(str)); Release. DC(hwnd, hdc); break; case WM_DESTROY : Post. Quit. Message (0) ; return 0 ; } 17/211

2 -5 입력된 문자열 출력 HDC hdc ; PAINTSTRUCT ps ; static char str[100];

2 -5 입력된 문자열 출력 HDC hdc ; PAINTSTRUCT ps ; static char str[100]; static int count; switch (i. Msg) { case WM_CREATE : count = 0; return 0 ; case WM_CHAR: hdc = Get. DC(hwnd); str[count++] = w. Param; str[count] = ''; Text. Out(hdc, 0, 0, strlen(str)); Release. DC(hwnd, hdc); break; case WM_DESTROY : Post. Quit. Message (0) ; return 0 ; } 19/211

2 -6 첫 번째 문제 해결 switch (i. Msg) { case WM_CREATE : count

2 -6 첫 번째 문제 해결 switch (i. Msg) { case WM_CREATE : count = 0; return 0 ; case WM_PAINT: // 화면이 가렸다 보일 때(자동 메시지 생성), 다시 그림 hdc = Begin. Paint(hwnd, &ps); Text. Out(hdc, 0, 0, strlen(str)); End. Paint(hwnd, &ps); break; case WM_CHAR: hdc = Get. DC(hwnd); str[count++] = w. Param; str[count] = ''; Text. Out(hdc, 0, 0, strlen(str)); // 차후 개선 : 그리는 대신 WM_PAINT 발생 Release. DC(hwnd, hdc); break; 21/211

2 -7 문자키 입력 시 WM_PAINT 강제 발생 switch (i. Msg) { case WM_CREATE

2 -7 문자키 입력 시 WM_PAINT 강제 발생 switch (i. Msg) { case WM_CREATE : count = 0; return 0 ; case WM_PAINT: hdc = Begin. Paint(hwnd, &ps); Text. Out(hdc, 0, 0, strlen(str)); End. Paint(hwnd, &ps); break; case WM_CHAR: str[count++] = w. Param; str[count] = ''; Invalidate. Rgn(hwnd, NULL, TRUE); // 다시 그리는 대신에, 강제 처 리 break; 22/211

두 번째 문제 해결 • 화면에 표시되지 않는 제어문자는 가상키 테이블 이용 가상키 내용

두 번째 문제 해결 • 화면에 표시되지 않는 제어문자는 가상키 테이블 이용 가상키 내용 VK_CANCEL Ctrl+Break VK_END End VK_BACK Backspace VK_HOME Home VK_TAB Tab VK_LEFT 좌측 화살표 VK_RETURN Enter VK_UP 위쪽 화살표 VK_SHIFT Shift VK_RIGHT 우측 화살표 VK_CONTROL Ct기 VK_DOWN 아래쪽 화살표 VK_MENU Alt VK_INSERT Insert VK_CAPITAL Caps Lock VK_DELETE Delete VK_ESCAPE Esc VK_F 1 ~ VKF 10 F 1 -F 10 VK_SPACE Space VK_NUMLOCK Num Lock VK_PRIOR Page Up VK_SCROLL Scroll Lock VK_NEXT Page Down 23/211

2 -8 Backspace 입력 처리 static char str[100]; static count; switch (i. Msg) {

2 -8 Backspace 입력 처리 static char str[100]; static count; switch (i. Msg) { case WM_CREATE : count = 0; return 0 ; case WM_PAINT: hdc = Begin. Paint(hwnd, &ps); Text. Out(hdc, 0, 0, strlen(str)); End. Paint(hwnd, &ps); break; case WM_CHAR: if (w. Param == VK_BACK) count--; else str[count++] = w. Param; str[count] = ''; Invalidate. Rgn(hwnd, NULL, TRUE); break; 24/211

Caret 만들기(커서) • • Caret: 키보드 입력 시 깜박거리는 커서 Caret 만들고 보이기 Create.

Caret 만들기(커서) • • Caret: 키보드 입력 시 깜박거리는 커서 Caret 만들고 보이기 Create. Caret(hwnd, NULL, width, height); Show. Caret(hwnd); • width Caret의 위치 설정하기 Set. Caret. Pos(x, y); • Caret 감추기 height Hide. Caret(hwnd); • Caret 삭제하기 Destroy. Caret(); 25/211

출력될 문자열 폭 구하기 • BOOL Get. Text. Extent. Point( HDC hdc, LPCTSTR lp.

출력될 문자열 폭 구하기 • BOOL Get. Text. Extent. Point( HDC hdc, LPCTSTR lp. String, int cb. String, LPSIZE lp. Size // 문자열의 크기(폭, 높이) ); • LPSIZE *; struct tag. SIZE { // 문자열의 폭과 높이 저장 LONG cx; LONG cy; } SIZE; 27/211

“Abijc” 폭 구하기 SIZE size; Get. Text. Extent. Point(hdc, "Abijc", 5, &size); Text. Out(hdc,

“Abijc” 폭 구하기 SIZE size; Get. Text. Extent. Point(hdc, "Abijc", 5, &size); Text. Out(hdc, x, y, ”Abijc”, 5); Set. Caret. Pos(x+size. cx, y); (0, 0) y x size. cy Abijc 28/211

Caret 표시 static char str[100]; static count; static SIZE size; switch (i. Msg) {

Caret 표시 static char str[100]; static count; static SIZE size; switch (i. Msg) { case WM_CREATE : Create. Caret(hwnd, NULL, 5, 15); Show. Caret(hwnd); // 빈 화면에 캐럿 표시 count = 0; return 0 ; case WM_PAINT: hdc = Begin. Paint(hwnd, &ps); Get. Text. Extent. Point(hdc, strlen(str), &size); Text. Out(hdc, 0, 0, strlen(str)); Set. Caret. Pos(size. cx, 0); End. Paint(hwnd, &ps); break; 29/211

Caret 표시(계속) case WM_CHAR: if (w. Param == VK_BACK) count--; else str[count++] = w.

Caret 표시(계속) case WM_CHAR: if (w. Param == VK_BACK) count--; else str[count++] = w. Param; str[count] = ''; Invalidate. Rgn(hwnd, NULL, TRUE); break; case WM_DESTROY : Hide. Caret(hwnd); Destroy. Caret(); Post. Quit. Message (0) ; return 0 ; } 30/211

2 -10 원 그리기 HDC hdc ; PAINTSTRUCT ps ; switch (i. Msg) {

2 -10 원 그리기 HDC hdc ; PAINTSTRUCT ps ; switch (i. Msg) { case WM_CREATE : return 0 ; case WM_PAINT : hdc = Begin. Paint (hwnd, &ps) ; Ellipse(hdc, 0, 0, 40); // 박스의 좌표, 중심점 (20, 20) End. Paint (hwnd, &ps) ; return 0 ; case WM_DESTROY : Post. Quit. Message (0) ; return 0 ; } 33/211

2 -11 사각형 그리기 예제 HDC hdc ; PAINTSTRUCT ps ; switch (i. Msg)

2 -11 사각형 그리기 예제 HDC hdc ; PAINTSTRUCT ps ; switch (i. Msg) { case WM_CREATE : return 0 ; case WM_PAINT : hdc = Begin. Paint (hwnd, &ps) ; Rectangle(hdc, 0, 0, 40); End. Paint (hwnd, &ps) ; return 0 ; case WM_DESTROY : Post. Quit. Message (0) ; return 0 ; } 35/211

다각형 그리기 • 연속되는 여러 점의 좌표를 직선으로 연결하여 다각형 을 그림 BOOL Polygon(

다각형 그리기 • 연속되는 여러 점의 좌표를 직선으로 연결하여 다각형 을 그림 BOOL Polygon( HDC hdc, CONST POINT *lppt, int c. Points // 꼭지점의 수 X 1 Y 1 X 2 Y 2 Xn Yn (X 1, Y 1) (X 2, Y 2) ); typedef struct tag. POINT { LONG x; LONG y; } POINT; (Xn, Yn) 36/211

2 -12 다각형 그리기 예제 HDC hdc ; PAINTSTRUCT ps ; POINT point[10] =

2 -12 다각형 그리기 예제 HDC hdc ; PAINTSTRUCT ps ; POINT point[10] = {{10, 20}, {100, 30}, {500, 200}, {600, 300}, {200, 300}}; switch (i. Msg) { case WM_CREATE : return 0 ; case WM_PAINT : hdc = Begin. Paint (hwnd, &ps) ; Polygon(hdc, point, 5); // 5각형 End. Paint (hwnd, &ps) ; return 0 ; case WM_DESTROY : Post. Quit. Message (0) ; return 0 ; } 37/211

2 -13 빨간 점선으로 원 그리기 HDC hdc ; PAINTSTRUCT ps ; HPEN h.

2 -13 빨간 점선으로 원 그리기 HDC hdc ; PAINTSTRUCT ps ; HPEN h. Pen, old. Pen; switch (i. Msg) { case WM_CREATE : return 0 ; case WM_PAINT : hdc = Begin. Paint (hwnd, &ps) ; h. Pen = Create. Pen(PS_DOT, 1, RGB(255, 0, 0)); old. Pen = (HPEN)Select. Object(hdc, h. Pen); // 새로운 펜의 사용 선언 Ellipse(hdc, 20, 300); Select. Object(hdc, old. Pen); // 이전의 펜으로 돌아감 Delete. Object(h. Pen); End. Paint (hwnd, &ps) ; return 0 ; 40/211

빨간색 원 그리기 HDC hdc ; PAINTSTRUCT ps ; HBRUSH h. Brush, old. Brush;

빨간색 원 그리기 HDC hdc ; PAINTSTRUCT ps ; HBRUSH h. Brush, old. Brush; switch (i. Msg) { case WM_CREATE : return 0 ; case WM_PAINT : hdc = Begin. Paint (hwnd, &ps) ; h. Brush = Create. Solid. Brush(RGB(255, 0, 0)); old. Brush = (HBRUSH)Select. Object(hdc, h. Brush); Ellipse(hdc, 20, 300); Select. Object(hdc, old. Brush); Delete. Object(h. Brush); End. Paint (hwnd, &ps) ; return 0 ; 42/211