오늘 처음으로 API에 대해서 공부를 했습니다.
일반 학교들은 API, MFC는 기본으로 배운다는데
울 학교는 전문대라서 그런지 C, java 정도는 배우고는 그냥 끝이어서 제대로 배우질 못했었죠
그러다가 지금 약간의 여유가 생기어서 한번 WIN API에 대해서 공부해보기로 하였고 드디어 공부를 시작하게 되었습니다. 제가 공부한 것을 포스팅 하는 것이기에 상당히 초보적인 수준이라는 점. 그리고 잘못 된 점이 있을 수 있다는거 꼭 인지하시길 부탁드립니다 ^ㅡ^
개발 환경은 VC++ 6.0 이후의 어떤 버전이라도 상관은 없습니다 ㅎ
오늘은 그냥 아무것도 없는 윈도우 창 하나를 띄우는 프로그램을 만들려고 합니다. C#이나 비주얼 베이직에서는 진짜 간단하게 만들 윈도우창 하나도 API로 만들게 되면 상당히 긴 코드가 필요하더군요. 소문자 대문자도 상당히 잘 지켜야되고. 많이 까다롭다는 생각이 들었습니다. 그럼 한번 코드를 보도록 하죠. 첨에는 별거 없잖아요 ㅎㅎ
1 #include<windows.h>
2
3 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
4 HINSTANCE g_hInst;
5 LPCTSTR lpszClass=TEXT("First");
6
7 int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdParam,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,CW_USEDEFAULT,CW_USEDEFAULT,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 return (int)Message.wParam;
35 }
36
37 LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
38 {
39 switch(iMessage)
40 {
41 case WM_DESTROY:
42 PostQuitMessage(0);
43 return 0;
44 }
45 return(DefWindowProc(hWnd,iMessage,wParam,lParam));
46 }
창하나 띄우는 프로그램 만드는데 코드만 46줄이 들죠. 한동안 C#만 하다 보니 이렇게 길게 코드 쓰는게 적응이 안되더군요...암튼 이렇게 코드를 짜주시면 심플한 힌색 바탕의 윈도우창 하나가 뜨는 모습을 보실수 있습니다.
저도 잘은 모르지만 약간의 코드 분석을 해보겠습니다. 우선 모든 API 함수들의 원형과 사용되는 상수들이 다 windows.h에 들어있다는 것입니다. 이런 기초 부문에서는 windows.h만 추가해도 문제가 없다는 것입니다. 그리고 시작되는 곳은 WinMain함수에서부터 시작되어 집니다. 도스의 main함수와 같다고 보시면 됩니다. 다른점이라면 WinMain 함수의 원형은 위와 항상 같다는 것입니다. 각각의 인수에 대해서도 의미가 있지만 그걸 다 설명하자니 배움이 적고 그래서...시작점이 WinMain함수라는것만 알고 넘어가겠습니다. 인수에 대한 설명은 www.winapi.com에 자세히 설명되어 있으니 거기서 참조하시길 바랍니다 ^^
3번째 줄에 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM) 이 부분이 메시지 처리 함수의 원형을 만드는 것입니다. 실질적으로 모든 이벤트와 기능들이 WndProc에서 처리되는 것이지요. 아직은 그저 윈도우를 꺼버리는 역활만 정의되어 있는 상태입니다. 나중이 되면 엄청 많은 이벤트들이 들어가겠죠. 또 많은 함수들도 만들어져서 추가될꺼구요 ^^
중요한 내용중 하나가 바로 윈도우 창을 만드는것이죠. 윈도우창을 만드는 함수가 CreateWindow라는 함수입니다. 그리고 WNDCLASS는 생성될 윈도우의 여러가지 특성을 정의하는 구조체로써 여러가지 특성을 정의해줄수 있죠. 이것은 우리가 다 암기할 필요는 아직 없다고 할 수 있죠. 정확한 내용은 www.winapi.com에서 봐주시길 바랍니다 ^^;; 이중에서 한가지 본다면 24번째 줄에 RegisterClass(&WndClass) 이녀석이죠. 이녀석은 위에서 정의한 윈도우의 특성을 등록하는 기능을 가진 함수입니다. 이녀석을 추가하지 않는다면 윈도우는 생성되지 않습니다. 제 말이 의심스럽다면 한번...빼고 실행해보세요 ^^
그리고 CreateWindow의 파라미터에서 윈도우의 여러가지 모양을 바꿀수 있습니다. 이것도 설명은 하지 않겠습니다. WinMain안에 있는 코드가 들어가야 윈도우가 생성된다는거을 알아두시기 바랍니다~
제가 공부한 부분은 오늘 여기까지이네요. 더 많은 내용이 있지만 그걸 다 설명하기에는 힘든 부분이 있어 여기에서 마치도록 하죠 ^^
감사합니다~
출처 : 윈도우즈 API 정복(저자 :김상형님)
'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 |
버튼 생성 (0) | 2010.03.06 |