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("Key"); //윈도우 제목으로 사용되는 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: HDC hdc;
72: PAINTSTRUCT ps;
73: static int x;
74: static int y;
75: static BOOL bNowDraw = FALSE;
76:
77: switch(iMessage) {
78: case WM_LBUTTONDOWN:
79: x = LOWORD(lParam);
80: y = HIWORD(lParam);
81: bNowDraw = TRUE;
82: return 0;
83:
84: case WM_MOUSEMOVE:
85: if(TRUE == bNowDraw)
86: {
87: hdc = GetDC(hWnd);
88: MoveToEx(hdc, x, y, NULL);
89: x = LOWORD(lParam);
90: y = HIWORD(lParam);
91: LineTo(hdc, x, y);
92: ReleaseDC(hWnd, hdc);
93: }
94: return 0;
95:
96: case WM_LBUTTONUP:
97: bNowDraw = FALSE;
98: return 0;
99:
100: case WM_DESTROY:
101: PostQuitMessage(0);
102: return 0;
103: }
104:
105: return(DefWindowProc(hWnd, iMessage, wParam, lParam));
106: }
107:
108: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text)
109: {
110: TextOut(hdc, x, y, Text, strlen(Text));
111: }