오늘은 윈도우 창에 버튼을 만드는것을 공부했습니다
역시 C#에 충실해 있던 저에게는 API로 버튼 만드는건 참 생소한 환경이었죠
이제 본론으로 들어가겠습니다. Win 32 api에서는 컨트롤들이 다 하나의 윈도우로 여겨집니다. 그래서 컨트롤을 만들때도 CreateWindow 함수를 쓰게 되죠. 그리고 컨트롤이 생성 되는 시기도 부모 윈도우가 생성될 때, WM_CREATE 메시지가 발생했을 때 생성하게 됩니다.
또 여기서 한가지 알고 넘어갈 것은 일반적으로 우리가 알고 있는 버튼 말고도 체크박스, 라디오 버튼 또한 버튼으로 구분된다는 것입니다. 그리고 컨트롤들은 부모 윈도우의 차일드 이므로 WS_CHILD 스타일을 반드시 주게 됩니다. 또한 WS_VISIBLE 스타일을 주어야 ShowWindow 함수를 호출하지 않아도 컨트롤이 화면에 출력되므로 같이 주어지는게 좋습니다.
그럼 버튼을 생성해 주는 코드를 보도록 하겠습니다.
1 #include <windows.h>
2
3 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
4 HINSTANCE g_hInst;
5 LPCTSTR lpszClass = TEXT("BUTTON TEST");
6
7 int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
8 {
9 HWND hWnd;
10 MSG Message;
11 WNDCLASS WndClass;
12 g_hInst = hInstance;
13
14 WndClass.cbClsExtra = 0;
15 WndClass.cbWndExtra = 0;
16 WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
17 WndClass.hCursor = LoadCursor(NULL,IDC_ARROW);
18 WndClass.hIcon = LoadIcon(NULL,IDI_APPLICATION);
19 WndClass.hInstance = hInstance;
20 WndClass.lpfnWndProc = WndProc;
21 WndClass.lpszClassName = lpszClass;
22 WndClass.lpszMenuName = NULL;
23 WndClass.style=CS_HREDRAW | CS_VREDRAW;
24 RegisterClass(&WndClass);
25
26 hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, (HMENU)NULL, hInstance, NULL);
27 ShowWindow(hWnd, nCmdShow);
28
29 while(GetMessage(&Message,NULL,0,0))
30 {
31 TranslateMessage(&Message);
32 DispatchMessage(&Message);
33 }
34
35 return (int)Message.wParam;
36 }
37
38 LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
39 {
40 switch(iMessage)
41 {
42 case WM_CREATE:
43 CreateWindow(TEXT("button"), TEXT("Click me"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20, 100, 25, hWnd, (HMENU)0, g_hInst, NULL);
44 CreateWindow(TEXT("button"), TEXT("Me Two"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 50, 100, 25, hWnd, (HMENU)1, g_hInst, NULL);
45 return 0;
46 case WM_COMMAND:
47 switch(LOWORD(wParam))
48 {
49 case 0:
50 MessageBox(hWnd,TEXT("First Button Clicked"), TEXT("Button"), MB_OK);
51 break;
52 case 1:
53 MessageBox(hWnd,TEXT("Second Button Clicked"), TEXT("button"), MB_OK);
54 break;
55 }
56 return 0;
57 case WM_DESTROY:
58 PostQuitMessage(0);
59 return 0;
60 }
61 return (DefWindowProc(hWnd, iMessage, wParam, lParam));
62 }
다음과 같이 입력하고 실행을 하게 되면 버튼 두개가 있는 윈도우 창이 생성되는걸 볼수 있죠
버튼 생성하는 코드를 잠시 살펴 보겠습니다. 43번째 줄에 보면 다음과 같은 코드가 있죠
CreateWindow(TEXT("button"), TEXT("Click me"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 20, 20, 100, 25, hWnd, (HMENU)0, g_hInst, NULL);
첫번째 인수 TEXT("buttone")은 클래스를 알려주는 부분이고, 두번째는 버튼의 텍스트 부분, 세번째가 버튼의 스타일선언, 네번째부터 일곱번째 부분이 위치와 크기, 여덟번째가 hWnd의 차일드로 생성하라는것, 아홉번째가 아이디를 나타내는 부분으로 아이디가 0이죠, 열번째는 윈도우를 만드는 인스턴스핸들로써 hInstance 사본인 g_hInst를넘깁니다. 11번째는 사용자 정의 데이터라고 합니다. 현재는 저도 잘 모르겠구요 ㅎ
보시는봐와 같이 WM_CREATE에서 만들어지게 되죠.
마지막으로 부모와의 메시지 통신에 대해 보겠습니다. 해당 버튼을 클릭하게 되면 WM_COMMAND 메시지를 부모 윈도우에게 보내게 됩니다. 그로 인해서 메시지박스가 출력 되게 되는것입니다.
오늘은 버튼에 대해서 공부했는데요. 버튼으로 참 많은걸 해볼수 있을 것으로 기대되네요
앞으로 더 많은 공부로 많은 발전을 하도록 하겠습니다 ^^
출처 : API 정복 1권(저자 : 김상형님)
'API' 카테고리의 다른 글
1초에 한번씩 캡쳐 화면 파일로 저장하기 (0) | 2010.03.27 |
---|---|
디렉토리 생성 (0) | 2010.03.27 |
Win API Timer (0) | 2010.03.21 |
캡쳐 화면 BMP로 저장하기 (0) | 2010.03.14 |
메뉴의 단축키, 액셀러레이터 생성 (0) | 2010.03.12 |
메뉴 만들기 (1) | 2010.03.11 |
포커스가 있는 윈도우 캡쳐 (0) | 2010.03.10 |
API로 구현한 전체화면 캡쳐 소스 (0) | 2010.03.09 |
DC 구조체에 관해.... (1) | 2010.03.09 |
API의 첫 시작 (0) | 2010.03.05 |