'language/API'에 해당되는 글 8건

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

,

64비트 API

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

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

64비트 API


풍부한 메모리 공간을 지원(기존 32비트: 4GB, 64비트에서는 16TB)


주소 공간이 확대됨으로써 포인터의 크기가 64비트로 확장되었다.


INT_PTR, LONG_PTR, UINT_PTR, ULONG_PTR, DWORD_PTR


_PTR이 붙은 타입은 운영체제의 비트수에 따라 크기가 가변적이며 포인터와 같은 길이를 가진다.

포인터와 호환되어야하는 정수가 필요할 때는 이 타입을 사용해야 한다.


INT_PTR 타입은 32비트 환경에서는 32비트지만 64비트 환경에서는 64비트이다.



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

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

saylin

,

유니코드(Unicode)

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

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

유니코드(Unicode)


16비트의 단일한 값으로 지구상의 모든 문자를 표현할 수 있는 문자 코드 체계이다.

유니코드를 지원하려면 문자형이나 문자열에 대해 C언어의 타입을 사용하기보다는 유니코드 설정에 따라 변경되는 중간타입을 사용해야 한다.,


char: TCHAR


char*: LPSTR

const char*: LPCTSTR


문자열을 다루는 함수들도 C의 표준 함수를 쓰지 않고 가급적이면 유니코드를 인식하는 함수를 사용한다.


strlen: lstrlen

strcpy: lstrcpy

strcat: lstrcat

strcmp: lstrcmp


sprintf: wsprintf



TEXT 매크로는 유니코드 설정에 따라 문자열 상수의 타입을 변경한다.


TCHAR *str="string";

TCHAR *str=TEXT("string");    // TEXT 매크로 안에 문자열 상수를 쓴다.





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

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

saylin

,

비트 OR 연산자

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

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

비트 OR 연산자


CreateWindow(bTitleBar, bResizable, bMaxButton, bMinbutton, bBorder, bChild, bPopup, ...);

사용자가 원하는 작업을 하기 위해 함수를 호출하는데, 이 때 함수에는 작업의 내용을 전달하는 인수가 같이 전달된다.

이러한 인수에는 작업의 목적과 방법을 지정하는 정보가 포함된다.


위와 같이 세부 정보(옵션)의 개수가 수십가지가 되는 경우, 

함수를 호출할 때 CreateWindow(NULL, 0, FALSE, 0, 0, 0,... )과 같이 값을 일일이 지정해야하므로 매우 불편하다. 

이러한 문제를 해결하기 위해서 등장한 것이 매크로 상수이다. 

이는 비트 OR 연산자가 교환법칙이 가능함으로써 성립된다.



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

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

saylin

,