2011년8월25일_winAPI_그림그리기..그래픽(dot, line, rectangle, ellipse), MessageBox
참조(Reference) |
● 그래픽예제 + 내가 그린거와 선생님 문제
1: // winAPI정복 page.58 예제: TextOut
2: // 2011년 8월 23일 작성
3:
4: /* 윈도우즈 프로그래밍 순서 WinMain()
5:
6: WndClass정의
7: ↓
8: 클래스를 등록
9: ↓
10: 메모리상에 윈도우 생성
11: ↓
12: 윈도우를 화면에 출력
13: ↓
14: 메시지 루프 (반복) 여기서 텍스트 출력할 것.
15: */
16:
17: #include <windows.h> // 모든 API함수들의 원형과 사용하는 상수들이 정의되어 있음.
18:
19: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //메시지처리함수
20: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text);
21:
22: HINSTANCE g_hlnst; //핸들 인스턴스
23: LPCTSTR lpszClass = TEXT("GraphOut"); //윈도우 제목으로 사용되는 const char * (문자열)
24:
25: /***************************************************************************************************************************
26: WinMain은 엔트리 포인트(시작함수)
27: APIENTRY는 윈도우즈 표준호출규약 _stdcall(없어도 무방함)
28:
29: WinMain의 인자들...
30: ① hInstance: 프로그램의 인스턴스 핸들
31: ② hPrevInstance: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들로 16비트와 호환성위한 것이니 무시하자. Win32는 NULL이다.
32: ③ lpszCmdParam: 명령행으로 입력된 프로그램의 인수 (콘솔app에서 argv), 보통 실행직후에 열 파일의 경로가 전달됨.
33: ④ nCmdShow: 프로그램이 실행될 형태이며 최소화, 보통 모양 등이 전달된다.
34: ***************************************************************************************************************************/
35: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
36: {
37: HWND hWnd;
38: MSG Message;
39: WNDCLASS WndClass;
40: g_hlnst = hInstance;
41:
42: WndClass.cbClsExtra = 0;
43: WndClass.cbWndExtra = 0;
44: WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
45: WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
46: WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
47: WndClass.hInstance = hInstance;
48: WndClass.lpfnWndProc = WndProc;
49: WndClass.lpszClassName = lpszClass;
50: WndClass.lpszMenuName = NULL;
51: WndClass.style = CS_HREDRAW | CS_VREDRAW;
52: RegisterClass(&WndClass);
53:
54: /*
55: hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
56: CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
57: NULL, (HMENU)NULL, hInstance, NULL);
58: */
59: hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
60: 100, 100, 800, 800,
61: NULL, (HMENU)NULL, hInstance, NULL);
62:
63: ShowWindow(hWnd, nCmdShow);
64:
65: while(GetMessage(&Message, NULL, 0, 0)) {
66: TranslateMessage(&Message);
67: DispatchMessage(&Message);
68: }
69:
70: return (int)Message.wParam;
71: }
72:
73: LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
74: {
75: HDC hdc;
76: PAINTSTRUCT ps;
77: TCHAR *str, str1[120];
78: int Score;
79: int x, y;
80:
81: switch(iMessage) {
82: case WM_DESTROY:
83: PostQuitMessage(0);
84: return 0;
85:
86: case WM_PAINT: //윈도우에 변화가 일어나면 (모든)
87: hdc = BeginPaint(hWnd, &ps); //DC를 얻음.
88: /* 책과 내꺼
89: SetPixel(hdc, 10, 10, RGB(255, 0, 0));
90:
91: MoveToEx(hdc, 50, 50, NULL);
92: LineTo(hdc, 300, 90);
93:
94: Rectangle(hdc, 50, 100, 200, 180);
95:
96: Ellipse(hdc, 220, 100, 400, 200);
97:
98: // (-_-)
99: Ellipse(hdc, 500, 500, 750, 650);
100: MoveToEx(hdc, 550, 550, NULL);
101: LineTo(hdc, 600, 550);
102: MoveToEx(hdc, 600, 600, NULL);
103: LineTo(hdc, 650, 600);
104: MoveToEx(hdc, 650, 550, NULL);
105: LineTo(hdc, 700, 550);
106: */
107:
108: //선생님 문제...집그리기
109: MoveToEx(hdc, 50, 150, NULL);
110: LineTo(hdc, 150, 50);
111: LineTo(hdc, 250, 150);
112: LineTo(hdc, 250, 350);
113: LineTo(hdc, 50, 350);
114: LineTo(hdc, 50, 150);
115: LineTo(hdc, 250, 150); //여기까지 지붕.
116:
117: Rectangle(hdc, 100, 200, 150, 250); //창문.
118: for(x = 0, y = 0 ; x < 25 ; x++ , y++)
119: {
120: Rectangle(hdc, 100 + x, 200 + y, 150 - x, 250 - y); //창문색칠
121: }
122:
123: Rectangle(hdc, 500, 50, 600, 150);
124: Ellipse(hdc, 500, 50, 600, 150);
125:
126: //내꺼...나무
127: Rectangle(hdc, 550 - 200, 350, 560 - 200, 300);
128: Ellipse(hdc, 530 - 200, 200, 580 - 200, 300);
129:
130: for(x = 0, y = 0 ; x < 50 ; x++, y++)
131: {
132: Ellipse(hdc, 530 - 200 + x, 200 + y, 580 - 200 - x, 300 - y);
133: }
134:
135: EndPaint(hWnd, &ps); //DC해제
136: return 0;
137:
138:
139: }
140:
141: return(DefWindowProc(hWnd, iMessage, wParam, lParam));
142: }
143:
144: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text)
145: {
146: TextOut(hdc, x, y, Text, strlen(Text));
147: }
● 메시지박스 예제
1: // winAPI정복 page.58 예제: TextOut
2: // 2011년 8월 23일 작성
3:
4: /* 윈도우즈 프로그래밍 순서 WinMain()
5:
6: WndClass정의
7: ↓
8: 클래스를 등록
9: ↓
10: 메모리상에 윈도우 생성
11: ↓
12: 윈도우를 화면에 출력
13: ↓
14: 메시지 루프 (반복) 여기서 텍스트 출력할 것.
15: */
16:
17: #include <windows.h> // 모든 API함수들의 원형과 사용하는 상수들이 정의되어 있음.
18:
19: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //메시지처리함수
20: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text);
21:
22: HINSTANCE g_hlnst; //핸들 인스턴스
23: LPCTSTR lpszClass = TEXT("First"); //윈도우 제목으로 사용되는 const char * (문자열)
24:
25: /***************************************************************************************************************************
26: WinMain은 엔트리 포인트(시작함수)
27: APIENTRY는 윈도우즈 표준호출규약 _stdcall(없어도 무방함)
28:
29: WinMain의 인자들...
30: ① hInstance: 프로그램의 인스턴스 핸들
31: ② hPrevInstance: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들로 16비트와 호환성위한 것이니 무시하자. Win32는 NULL이다.
32: ③ lpszCmdParam: 명령행으로 입력된 프로그램의 인수 (콘솔app에서 argv), 보통 실행직후에 열 파일의 경로가 전달됨.
33: ④ nCmdShow: 프로그램이 실행될 형태이며 최소화, 보통 모양 등이 전달된다.
34: ***************************************************************************************************************************/
35: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
36: {
37: HWND hWnd;
38: MSG Message;
39: WNDCLASS WndClass;
40: g_hlnst = hInstance;
41:
42: WndClass.cbClsExtra = 0;
43: WndClass.cbWndExtra = 0;
44: WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
45: WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
46: WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
47: WndClass.hInstance = hInstance;
48: WndClass.lpfnWndProc = WndProc;
49: WndClass.lpszClassName = lpszClass;
50: WndClass.lpszMenuName = NULL;
51: WndClass.style = CS_HREDRAW | CS_VREDRAW;
52: RegisterClass(&WndClass);
53:
54: /*
55: hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
56: CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
57: NULL, (HMENU)NULL, hInstance, NULL);
58: */
59: hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
60: 100, 100, 500, 500,
61: NULL, (HMENU)NULL, hInstance, NULL);
62:
63: ShowWindow(hWnd, nCmdShow);
64:
65: while(GetMessage(&Message, NULL, 0, 0)) {
66: TranslateMessage(&Message);
67: DispatchMessage(&Message);
68: }
69:
70: return (int)Message.wParam;
71: }
72:
73: LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
74: {
75: HDC hdc;
76: PAINTSTRUCT ps;
77: TCHAR *str, str1[120];
78: int iRet;
79: static int value = 0;
80:
81: switch(iMessage) {
82: case WM_DESTROY:
83: PostQuitMessage(0);
84: return 0;
85:
86: case WM_LBUTTONDOWN: //왼쪽 클릭시
87: iRet = MessageBox(hWnd, TEXT("마우스 왼쪽 버튼을 눌렀습니다."),
88: TEXT("메시지박스"), MB_OKCANCEL | MB_ICONWARNING);
89:
90: if(IDOK == iRet)
91: {
92: ++value;
93: wsprintf(str1, TEXT("value = %d"), value);
94: SetWindowText(hWnd, str1);
95: }
96:
97: return 0;
98:
99: case WM_RBUTTONDOWN: //오른쪽 클릭시
100: MessageBox(hWnd, TEXT("마우스 오른쪽 버튼을 눌렀습니다."),
101: TEXT("메시지박스"), MB_OK | MB_ICONQUESTION);
102: return 0;
103:
104: }
105:
106: return(DefWindowProc(hWnd, iMessage, wParam, lParam));
107: }
108:
109: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text)
110: {
111: TextOut(hdc, x, y, Text, strlen(Text));
112: }
● 메시지 박스 과제
1: // winAPI정복 page.58 예제: TextOut
2: // 2011년 8월 23일 작성
3:
4: /* 윈도우즈 프로그래밍 순서 WinMain()
5:
6: WndClass정의
7: ↓
8: 클래스를 등록
9: ↓
10: 메모리상에 윈도우 생성
11: ↓
12: 윈도우를 화면에 출력
13: ↓
14: 메시지 루프 (반복) 여기서 텍스트 출력할 것.
15: */
16:
17: #include <windows.h> // 모든 API함수들의 원형과 사용하는 상수들이 정의되어 있음.
18:
19: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //메시지처리함수
20: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text);
21:
22: HINSTANCE g_hlnst; //핸들 인스턴스
23: LPCTSTR lpszClass = TEXT("메시지 박스 연습"); //윈도우 제목으로 사용되는 const char * (문자열)
24:
25: /***************************************************************************************************************************
26: WinMain은 엔트리 포인트(시작함수)
27: APIENTRY는 윈도우즈 표준호출규약 _stdcall(없어도 무방함)
28:
29: WinMain의 인자들...
30: ① hInstance: 프로그램의 인스턴스 핸들
31: ② hPrevInstance: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들로 16비트와 호환성위한 것이니 무시하자. Win32는 NULL이다.
32: ③ lpszCmdParam: 명령행으로 입력된 프로그램의 인수 (콘솔app에서 argv), 보통 실행직후에 열 파일의 경로가 전달됨.
33: ④ nCmdShow: 프로그램이 실행될 형태이며 최소화, 보통 모양 등이 전달된다.
34: ***************************************************************************************************************************/
35: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
36: {
37: HWND hWnd;
38: MSG Message;
39: WNDCLASS WndClass;
40: g_hlnst = hInstance;
41:
42: WndClass.cbClsExtra = 0;
43: WndClass.cbWndExtra = 0;
44: WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
45: WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
46: WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
47: WndClass.hInstance = hInstance;
48: WndClass.lpfnWndProc = WndProc;
49: WndClass.lpszClassName = lpszClass;
50: WndClass.lpszMenuName = NULL;
51: WndClass.style = CS_HREDRAW | CS_VREDRAW;
52: RegisterClass(&WndClass);
53:
54:
55: hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
56: CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
57: NULL, (HMENU)NULL, hInstance, NULL);
58:
59: ShowWindow(hWnd, nCmdShow);
60:
61: while(GetMessage(&Message, NULL, 0, 0)) {
62: TranslateMessage(&Message);
63: DispatchMessage(&Message);
64: }
65:
66: return (int)Message.wParam;
67: }
68:
69: LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
70: {
71: TCHAR str1[120];
72: int iRet;
73: static int value = 0;
74:
75: switch(iMessage) {
76: case WM_DESTROY:
77: PostQuitMessage(0);
78: return 0;
79:
80: case WM_LBUTTONDOWN: //왼쪽 클릭시
81: iRet = MessageBox(hWnd, TEXT("왼쪽 버튼을 눌렀습니다."),
82: TEXT("마우스 확인"), MB_OK | MB_ICONINFORMATION);
83:
84: if(IDOK == iRet)
85: {
86: ++value;
87: wsprintf(str1, TEXT("value = %d"), value);
88: SetWindowText(hWnd, str1);
89: }
90:
91: return 0;
92:
93: case WM_RBUTTONDOWN: //오른쪽 클릭시
94: iRet = MessageBox(hWnd, TEXT("왼쪽 버튼을 눌렀습니까?"),
95: TEXT("마우스 확인"), MB_YESNO | MB_ICONQUESTION);
96:
97: if(IDNO == iRet)
98: {
99: ++value;
100: wsprintf(str1, TEXT("value = %d"), value);
101: SetWindowText(hWnd, str1);
102: }
103:
104: return 0;
105:
106: }
107:
108:
109: return(DefWindowProc(hWnd, iMessage, wParam, lParam));
110: }
111:
112: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text)
113: {
114: TextOut(hdc, x, y, Text, strlen(Text));
115: }