'WINAPI'에 해당되는 글 2건

WinMain

language/API 2016. 4. 26. 21:40
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

모든 API 프로그램을 만들기 전에 작성하는 가장 기본적인 코드이다.


#include <Windows.h>


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE g_hInst;

HWND hWndMain;

LPCTSTR IpszClass=TEXT("Class");


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpszCmdParam, int nCmdShow)

{

HWND hWnd;

MSG Message;

WNDCLASS WndClass;

g_hInst = hInstance;


WndClass.cbClsExtra=0;

WndClass.cbWndExtra=0;

WndClass.hbrBackground=(HBRUSH)GetStockObject(COLOR_WINDOW+1);

WndClass.hCursor=LoadCursor(NULL, IDC_ARROW);

WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);

WndClass.hInstance=hInstance;

WndClass.lpfnWndProc=WndProc;

WndClass.lpszClassName=IpszClass;

WndClass.lpszMenuName=NULL;

WndClass.style=CS_HREDRAW | CS_VREDRAW;

RegisterClass(&WndClass);


hWnd=CreateWindow(IpszClass, IpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL);

ShowWindow(hWnd, SW_RESTORE); // nCmdShow


while (GetMessage(&Message, NULL, 0, 0)) {

TranslateMessage(&Message);

DispatchMessage(&Message);

}

return (int)Message.wParam;

}


LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

HDC hdc;

PAINTSTRUCT ps;


switch(iMessage) {

case WM_CREATE:

hWndMain=hWnd;

return 0;

case WM_PAINT:

hdc=BeginPaint(hWnd, &ps);

EndPaint(hWnd, &ps);

return 0;

case WM_DESTROY:

PostQuitMessage(0);

return 0;

}

return(DefWindowProc(hWnd, iMessage, wParam, lParam));

}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

WinMain의 분석


windows.h 헤더 파일은 기본적인 데이터 타입, 함수 원형, 매크로 상수 등을 정의

그 외 윈도우즈 프로그래밍에 필요한 보조 헤더 파일을 포함한다.


모든 도스 프로그램이 #include <stdio.h>를 포함하는 것과 같이 윈도우즈 프로그램은 windows.h를 포함한다.



int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpszCmdParam, int nCmdShow)


WinMain의 원형은 다음과 같이 고정되어 있다.


APIENTRY 지정자: 윈도우즈의 표준 호출 규약인 __stdCall을 사용한다는 뜻

인스턴스(Instance): 실행 중인 프로그램 하나를 칭하는 용어


hInstance: 프로그램의 인스턴스 핸들. 즉, 프로그램 자체를 일컫는 정수값. 프로그램 자기 자신을 가리키는 1인칭 대명사.

hPrevInstance: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들. Win32에서는 항상 NULL. 16비트와의 호환성을 위해 아직도 존재하고 있는 유물과 같은 인수

IpszCmdParam: 명령행으로 입력된 프로그램 인수(도스의 argv인수). 보통 실행 직후에 열 파일의 경로가 전달된다.

nCmdShow: 프로그램이 실행될 형태(최소화, 보통 모양 등)


hInstance 이외에는 잘 사용되지 않는다.

많은 API 함수들이 hInstance 값을 인수로 요구하기 때문에 WinMain의 인수로 전달된 hInstance값을 전역변수 g_hInst에 대입해둔다.

hInstance 인수는 지역변수이므로 WinMain 바깥에서는 사용할 수 없다.


IpszClass라는 전역 문자열은 윈도우 클래스를 정의하는데 사용하며 윈도우의 타이틀 바에 표시되기도 한다.


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

메세지 처리함수


정의된 두 개의 함수 WinMain, WndProc 중 메세지를 처리하는 함수는 WndProc이다.

WinMain은 프로그램을 초기화하고 시작시키는 함수이므로 코드가 대체로 일정하다.

WndProc은 사용자와 시스템이 보내오는 메세지를 처리하는 아주 중요한 일을 담당한다. 즉, 프로그램의 실질적이고도 고유한 처리를 하는 함수다.

윈도우즈에서는 아주 특별한 경우를 제외하고는 위의 두 함수가 모두 있어야 한다.



LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


CALLBACK 매크로: APIENTRY와 마찬가지로 __stdcall로 정의되어 있다. 



'language > API' 카테고리의 다른 글

64비트 API  (0) 2016.04.26
유니코드(Unicode)  (0) 2016.04.26
비트 OR 연산자  (0) 2016.04.26
핸들(Handle)에 대한 이해  (0) 2016.04.26
변수명명법  (0) 2016.04.26
블로그 이미지

saylin

,
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

API에 대해 공부하면서 배운 내용들을 간단하게 정리하고자 블로그를 개설하게 되었다.

개인적인 복습을 위해서 배웠던 내용들을 바로 정리하지는 않고 선등록 후 편집하는 과정을 거칠 것 같다.


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

도스(DOS), 즉 Console 환경에서의 C 코드 중에서

아무 것도 출력하지 않고 프로그램을 종료하는 C 코드는 다음과 같다.


// Console

#include <stdio.h>


int main(void)

{

return 0;

}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

윈도우즈(Windows), GUI(Graphic User Interface) 환경에서도 위와 동일하게 

창 안에 아무 것도 없고 종료하는 기능만을 가지는 벙어리 윈도우를 생성하는 코드를 작성할 수 있다.

다만 Console 환경과 비교했을 때, 코드의 길이와 양 자체는 비교할 수 없을 정도로 길고 많다.


// Windows

#include <Windows.h>


LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

HINSTANCE g_hInst;

LPCTSTR IpszClass=TEXT("First");


int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR IpszCmdParam, int nCmdShow)

{

HWND hWnd;

MSG Message;

WNDCLASS WndClass;

g_hInst = hInstance;


WndClass.cbClsExtra=0;

WndClass.cbWndExtra=0;

WndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); // WHITE_BRUSH BLACK_BRUSH

WndClass.hCursor=LoadCursor(NULL, IDC_ARROW);

WndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION);

WndClass.hInstance=hInstance;

WndClass.lpfnWndProc=WndProc;

WndClass.lpszClassName=IpszClass;

WndClass.lpszMenuName=NULL;

WndClass.style=CS_HREDRAW | CS_VREDRAW;


RegisterClass(&WndClass);


hWnd=CreateWindow(IpszClass, IpszClass, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL);

ShowWindow(hWnd, SW_RESTORE); // nCmdShow


while (GetMessage(&Message, NULL, 0, 0)) {

TranslateMessage(&Message);

DispatchMessage(&Message);

}

return (int)Message.wParam;

}


LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)

{

switch(iMessage) {

case WM_DESTROY:

PostQuitMessage(0);

return 0;

case WM_LBUTTONDOWN:

MessageBeep(0);

return 0;

}

return(DefWindowProc(hWnd, iMessage, wParam, lParam));

}


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

윈도우즈의 특징 및 장점


1. 그래픽 기반(GUI)의 운영체제

2. 멀티 태스킹

3. 메세지 구동 시스템

4. 장치독립성(Device Driver의 제공)

5. 일관성

6. 리소스와 코드의 분리


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

API(Application Programming Interface)

운영체제가 응용프로그램을 위해 제공하는 함수의 집합







'language > API' 카테고리의 다른 글

유니코드(Unicode)  (0) 2016.04.26
비트 OR 연산자  (0) 2016.04.26
핸들(Handle)에 대한 이해  (0) 2016.04.26
변수명명법  (0) 2016.04.26
WM_SIZE  (0) 2016.04.24
블로그 이미지

saylin

,