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: SYSTEMTIME st;
74: static TCHAR sTime[128];
75: static RECT rt = {100, 100, 300, 120};
76:
77: switch(iMessage) {
78: case WM_CREATE:
79: SetTimer(hWnd, 1, 1000, NULL); //타이머 ID = 1, 1000ms후에 WM_TIMER 메시지발생.
80: SendMessage(hWnd, WM_TIMER, 1, 0); //WM_TIMER이벤트 강제발생.
81: return 0;
82:
83: case WM_TIMER:
84: GetLocalTime(&st);
85: wsprintf(sTime, TEXT("지금 시간은 %d:%d:%d입니다."),
86: st.wHour, st.wMinute, st.wSecond);
87: InvalidateRect(hWnd, &rt, TRUE);
88: return 0;
89:
90: case WM_PAINT:
91: hdc = BeginPaint(hWnd, &ps);
92: MyTextOut(hdc, 100, 100, sTime);
93: EndPaint(hWnd, &ps);
94: return 0;
95:
96: case WM_DESTROY:
97: KillTimer(hWnd, 1);
98: PostQuitMessage(0);
99: return 0;
100: }
101:
102: return(DefWindowProc(hWnd, iMessage, wParam, lParam));
103: }
104:
105: void MyTextOut(HDC hdc, int x, int y, LPCTSTR Text)
106: {
107: TextOut(hdc, x, y, Text, strlen(Text));
108: }