'Programming/API'에 해당되는 글 4건

  1. 2014.06.07 API 개인 정리
  2. 2014.06.06 Flag성 메시지와 함수
  3. 2014.06.06 API 2일차 도형 움직이기, 총알쏘기(06.05)
  4. 2014.06.05 API 1일차 개요(0602)

기본개념 정리

Windows 운영체제는 장치 독립적이다(어떤기기든 드라이버만 깔면 사용 가능)

윈도우는 Message 기반 구동 프로그램이고 Message 는 양의 정수값이다.


인스턴스(INSTANCE)

메모리에 로드되어 실행된 프로그램을 운영체제가 확인하기 위해 할당하는 양의 정수값을 말한다. 동일한 프로그램은 같은 인스턴스 값을 가지고 있다.


핸들(handle)

핸들은 운영체제의 자원을 사용하거나 윈도우를 생성할 때, 운영체제로부터 할당되는 양의 정수값이다. 고유 ID로 생각하면 이해하기 쉽다.

HWND, HDC, HPEN, HBRUSH, HBITMAP --> void* 형이다.

-------------------------------------------------------------------------

WinMain() 의 주된 역할 : 윈도우의 생성

윈도우 속성 설정 및 등록

윈도우 생성과 출력

메시지 루프(WinProc 호출)


WinProc() 의 주된 역할 : 메시지의 처리, 콜백(Call Back) 함수이다


API 프로그래밍 작성 순서 6가지

1단계: 윈도우 클래스 구조체

2단계: 윈도우 구조체 등록

3단계: 윈도우 생성

4단계: 윈도우 출력

5단계: 메시지 루프

6단계: 메시지 처리 함수인 WndProc() 의 작성

참고

http://nowcampus.tistory.com/ API 2장 참고













윈도우 창에 텍스트 띄우기 (wsprintf사용)

1. 글자가 들어갈 변수 선언 ( ex TCHAR lpOut[1024]; )

2. DC 얻어오기 (WM_PAINT 메시지 안에서는 BeginPaint로 , 이외의 공간에서는 GetDC로 얻어온다.

3. TextOut(DC, left좌표, top좌표, 저장공간, 들어올 문자의 길이) 로 출력 설정

4. wsprintf(저장공간, TEXT("출력할 서식문자: %d %f 등", 실제 출력할 값) 으로 출력




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

Flag성 메시지와 함수  (0) 2014.06.06
API 2일차 도형 움직이기, 총알쏘기(06.05)  (0) 2014.06.06
API 1일차 개요(0602)  (0) 2014.06.05
Posted by 눈떠보니내무실
,

 

http://www.tipssoft.com/bulletin/tb.php/FAQ/632

 

참고

 

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

API 개인 정리  (0) 2014.06.07
API 2일차 도형 움직이기, 총알쏘기(06.05)  (0) 2014.06.06
API 1일차 개요(0602)  (0) 2014.06.05
Posted by 눈떠보니내무실
,

주요 메소드 정리(인자값 순서대로 1, 2, 3, 4, ~~)

 WORD SetTimer(HWND hWnd, int nIDEvent,WORD wElapse,FARPROC lpTimerFunc)

->타이머를 생성하고 wElapse가 지정하는 간격으로 WM_TIMER메시지를 보낸다

1. WM_TIMER 메시지를 받을 윈도우의 핸들.

2. 타이머 번호. 타이머끼리의 구분을 위해 필요. KillTimer에 의한 타이머 해지시에도 필요.

3. WM_TIMER 메시지가 생성될 시간 간격을 1/1000초 단위로 지정한다.

4. NULL일 경우 WndProc으로 메시지 전달. 값이 지정되면 지정한 콜백함수로 전달된다.

 ---------------------------------------------------------------------------

BOOL InvalidateRect(HWND hWnd, CONST RECT *lpRect, BOOL bErase);

->지정된 구역의 화면을 지우고 다시 그린다.

1. 영역 설정 핸들. NULL일 경우 범위는 모든 윈도우가 된다(모든 윈도우?? -_-^).

2. 무효화할 영역. NULL이면 작업영역 전체가 무효화 된다.

3. 영역의 배경을 먼저 지울지 결정하는 곳. TRUE라면 먼저 지우고 출력되어 화면이 갱신되 된다.(즉 화면을 계속 지웠다 그리려면 TRUE, 아니면 FALSE값을 주면 된다.)

flag성 메시지 함수이다.

 ---------------------------------------------------------------------------

HDC GetDC(HWND hWnd);

->윈도우즈 환경에서 화면이나 프린터로 출력을 하려면 DC를 먼저 구해야 한다. DC를 구하는 일반적인 방법은 두 가지가 있는데 WM_PAINT 메시지내에서 DC를 얻을 때는 BeginPaint, EndPaint 함수쌍을 사용하며 이 메시지 이외의 코드에서 DC를 얻을 때는 GetDC, ReleaseDC 함수쌍을 사용한다. GetDC의 인수로 DC를 구하고자 하는 핸들을 주면 이 윈도우의 DC를 구해준다. 사용 후 ReleaseDC(hWnd, hdc) 로 해지해 주어야 한다.

1. 구하고자 하는 윈도우 핸들. NULL일 경우 전체 화면에 대한 DC가 구해진다. 

 

GetAsyncKeyState(VK_키타입)

GetAsyncKeyState() 함수와 GetKeyState() 함수는 키보드의 키가 눌렸는지를 체크하는 함수들이다.

GetAsyncKeyState() 함수는 비 동기(Asynchronism)로 처리한다. 즉, 호출된 시점에서 키 상태를 조사하여, 메시지 큐를 거치지 않고 바로 리턴을 해 주므로 키 입력을 바로 처리해 줄 수가 있다.

GetKeyState() 함수는 호출된 시점에서 메시지 큐를 거치며, 메시지 발생 후의 상태를 리턴하게 되므로, 키보드 메시지 처리 루틴내에서 사용해야 한다. 게임과 같이 키 입력에 바로 반응을 해 줘야 하는 프로그램에서는 GetAsyncKeyState()함수를 사용하는 편이 좋다.

1. 입력 키 타입(VK_LEFT, VK_UP 등등~)

 ---------------------------------------------------------------------------

GetMessage : 메시지 큐에서 메시지를 읽되 무한 대기하며 메시지를 무조건 큐에서 제거한다.

 ---------------------------------------------------------------------------

BOOL PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg)

->GetMessage 함수와 마찬가지로 메시지 큐에서 메시지를 읽는다. 메시지의 범위를 줄 수 있는 기능도 GetMessage와 동일하다. 그러나 이 함수는 GetMessage와는 달리 읽은 메시지를 무조건 제거하지 않으며 큐가 비어 있을 경우 대기하지 않고 곧바로 리턴한다는 점이 다르다. 따라서 이 함수는 메시지를 읽지 않고 단순히 메시지가 있는지 확인만 할 수 있으며 이런 특성은 백그라운드 작업에 적절하다.

메시지 큐에 메시지가 있으면 0이 아닌 값을 리턴하고 메시지가 없으면 0을 리턴한다.

lpMsg: 메시지를 받을 구조체이다.

hWnd: 메시지를 받을 윈도우이며 이 윈도우로 보내지는 메시지를 조사한다. 이 윈도우는 반드시 같은 스레드에 소속된 윈도우여야 하며 다른 스레드로 보내지는 메시지는 조사할 수 없다. 이 인수가 NULL이면 이 함수를 호출한 스레드로 전달된 모든 메시지를 조사한다.

wMsgFilterMin: 조사할 메시지의 최소값

wMsgFilterMax : 조사할 메시지의 최대값. 이 두 인수를 사용하면 일정한 범위에 속한 메시지만 조사할 수 있는데 이를 메시지 필터링이라고 한다. 예를 들어 키보드 관련 메시지만 조사하고 싶으면 WM_KEYFIRST, WM_KEYLAST로 범위를 지정할 수 있다. 두 인수가 모두 0이면 메시지 필터링을 하지 않으며 모든 메시지를 조사한다.

wRemoveMsg : 조사한 메시지를 처리할 방법을 지정하는 플래그의 조합이다.

------------------------------------------------------------------------

플래그 설명

PM_NOREMOVE

메시지를 읽은 후 큐에서 메시지를 제거하지 않는다.

PM_REMOVE 메시지를 읽은 후 큐에서 메시지를 제거한다.
PM_NOYIELD 다른 스레드로 제어를 양보하지 않는다.
PM_QS_INPUT

디폴트로 이 함수는 모든 메시지를 다 처리하는데 이하의 플래그들을 지정하면 특정 메시지들만 처리하도록 할 수 있다. 이 플래그들은 98이상, 2000이상에서만 적용된다.

마우스나 키보드 등의 입력 메시지만 처리한다.

PM_QS_PAINT 그리기 메시지만 처리한다.
PM_QS_POSTMESSAGE 타이머나 핫키 메시지를 포함하여 붙여지는 메시지만 처리한다.
PM_QS_SENDMESSAGE 보내지는 메시지만 처리한다.

 -----------------------------------------------------------------------------------------------

좀더 쉽게~

PM_NOREMOVE: 메시지가 있는지만 확인하고 그냥 빠져나온다
PM_REMOVE: 값이 없으면 else값을 만들어주는 옵션

REMOVE: 읽은 메세지를 자동으로 삭제해주는 인수값

 ---------------------------------------------------------------------------

DWORD GetTickCount(VOID)
=> OS부팅할 때부터 지나간 시간을 msec 단위로 돌려주는 함수이다.

---------------------------------------------------------------------------

BOOL AdjustWindowRect(LPRECT lpRect, DWORD dwStyle, BOOL bMenu)

->작업 영역의 크기는 윈도우 크기에서 타이틀 바와 경계선, 메뉴, 스크롤 바 등의 영역을 제외한 영역이다. 일반적으로 MoveWindow, SetWindorPos 등의 함수로 윈도우 크기는 원하는대로 바꿀 수 있지만 작업 영역의 크기를 원하는대로 설정하는 방법은 없다. 작업 영역을 특정한 크기대로 설정하려면 이 함수로 원하는 윈도우 크기를 먼저 계산하고 MoveWindow 등의 함수로 윈도우 크기를 변경해야 한다.

이 함수는 윈도우의 스타일(타이틀 바의 유무, 타이틀 바의 높이, 경계선의 두께)와 메뉴의 존재 여부 등을 고려하여 작업 영역의 크기가 lpRect가 될 수 있는 윈도우 크기를 구해 lpRect로 리턴해 준다. 단 이 함수는 메뉴 바가 두 줄로 출력되어 있는 경우와 스크롤 바의 존재에 대해서는 정확한 계산을 해 주지 않는다. 만약 스크롤 바를 가지고 있다면 구해진 영역 크기에 스크롤바의 높이와 폭을 더해 주어야 한다.

 

lpRect:원하는 작업 영역의 사각 크기를 전달하면 이 인수로 조정된 윈도우 크기가 리턴된다.

dwStyle:윈도우의 스타일을 지정한다. WS_OVERLAPPED 스타일은 지정할 수 없다.

bMenu:메뉴가 있으면 TRUE를 전달하고 그렇지 않으면 FALSE를 전달한다.

---------------------------------------------------------------------------

 

 

 주요 Message 정리

WM_CREATE

윈도우 생성 후 화면에 출력되기 전에 보내지며 윈도우에 관련된 초기화 작업에 대한 내용이 처리된다. flag 메시지이다

 

WM_KEYDOWN

키보드 눌림에 따른 메시지를 받는다.

 

VK_ESCAPE

ESC 버튼에 관한 메시지를 받는다.

 

VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN

키보드의 좌우상하 입력을 받는다.

 

VK_SPACE

스페이스 버튼을 입력받는다.

 

WM_DESTROY

DestroyWindow 함수가 반환하는 DESTROY 메시지를 받는다. 윈도우가 파괴될 때 메시지를 받는다.

 

WM_TIMER (flag 메시지이다)

SetTimer 함수로 타이머를 설치했을 경우 지정한 시간 간격으로 이 메시지가 반복적으로 큐에 붙여진다. 주기적으로 어떤 작업을 반복해야 한다면 타이머를 설치하고 이 메시지에서 작업을 처리하도록 한다. 두 개 이상의 타이머가 설치되어 있을 경우 각각의 타이머는 정해진 시간 간격으로 이 메시지를 큐에 붙이며 WM_TIMER에서는 wParam으로 어떤 타이머에 의해 이 메시지가 발생했는지 조사한다.

 

 

 

기타 정리

 Message.msg : 메시지의 ID번호를 가져오거나 설정한다.

 

 extern : 전역변수 앞에 선언하면 모든 프로젝트 공간에서 사용가능하다. 은닉화를 파괴 하는 개념이기 때문에 꼭 필요할때만(다른파일에서 핸들값 사용하기) 사용해야 한다.

 

int WINCX, int WINCY : 여기서 C는 size의 헝가리안 표기법이다.

 

 

 

 

 

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

API 개인 정리  (0) 2014.06.07
Flag성 메시지와 함수  (0) 2014.06.06
API 1일차 개요(0602)  (0) 2014.06.05
Posted by 눈떠보니내무실
,

API = Application Programming Interface

 

용어

__stdcall //(함수가 가변인자를 가질 수 없다) 제공되는 함수 그대로 호출해서 써야한다

call back //API 함수 호출 규약, 시스템이 특정 상황인지를 수시로 체크하다 그 특정 상황이 되면 지정된 함수를 호출하게 됨

 

메시지 처리 ( API는 메시지 처리 방식이다!!)

Message Queue(이벤트->Message Queue 로 들어간다)

 A(출구)

 B

 B

 A

 C

 E(메시지들어옴)

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

OS를 거쳐 ----->A에 해당하는 곳으로 메시지 전달.(OS가 전달한다)

OS를 거쳐 ----->B에 해당하는 곳으로 메시지 전달.(OS가 전달한다)

 

모든 행동(키보드, 클릭 등등 메시지를 전달한다)
->하드웨어 이벤트로 인한 메시지 발생.

키보드-------->하드웨어 이벤트--------->OS가 감지------->메시지 처리------------>프로그램(처리)
처리 후 역순으로 메시지를 전달한다.

 

GetMessage 는 Message Queue가 내부에 삽입되어 있다.

while (GetMessage(&msg, NULL, 0, 0))  //quit 메시지가 들어오면 종료
{
     if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
     {
          TranslateMessage(&msg); //어떤 메시지가 들어오면 아스키코드로 치환
          DispatchMessage(&msg);  //메시지 처리 WndProc 호출한다.
     }
}

 

각 자료형 설명

handle : 핸들, 정수값, 각종 프로그램의 고유 식별 번호(각 프로그램마다 가지고 있다)
WPARAM : 키보드 메시지
LPARAM : 마우스 메시지
DWORD  : time
POINT  : 마우스의 좌표를 저장하기 위한 구조체

hInstance(창의 식별번호를 의미한다고 보면 된다)

 

아스키코드 치환 이유
API는 다국적을 지원하기 때문에(유니코드)

유니코드화 
일반상수 앞에 L을 넣어준다.
_T(), TEXT() 등을 넣어준다.

 

메시지 driven방식이란??

윈도우 프로그램의 기본 동작 방식이다.
즉 사용자(프로그램을 사용하는 사람)이 어떤 행동(즉, 마우스를 클릭했다거나 키보드를 눌렀을 경우)을 했을 때 윈도우 관리자로 사용자의 행동이 메시지 형태로 넘어간다.
그럼 윈도우 관리자는 그 메시지를 그 사용자가 행동한 윈도우 메시지 큐에 넣어주게 된다.
메시지 드라이븐(혹은 처리)방식이란
이렇듯 윈도우 관리자로 부터 메시지를 받았을 때 자신이 원하는 코딩을 해 주는 방식입니다. 직접적인 코딩이 필요없을 경우 다시 윈도우 관리자로 넘기게 된다.

 

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

실질적인 메시지 처리는 이 함수에서 한다. 핸들과 메시지, 키보드 마우스 값을 인자로 받는다.

 

그리기의 개념
그리기의 개념은 굉장히 빠르게 다른 그림들을 출력해서 움직이도록 보이는 것이다. 전에 있던 그림

은 지운다.
hdc :그림을 그리는 도화지라고 생각하면 이해하기 쉬움

x1 : LEFT
y1 : TOP
x2 : RIGHT
y2 : BOTTOM

 

//----------------------------

그림 그리기

case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);

  //이곳에 그리는 함수를 넣는다

  EndPaint(hWnd, &ps);

 

//-----------------------------

Esc로 창 파괴하기

case WM_KEYDOWN:
   switch(wParam)
   {
        case VK_ESCAPE:
        DestroyWindow(hWnd);
        break;
   }
   break;

 

//-----------------------------

메뉴 없애기

wcex.lpszMenuName = NULL;  //NULL이면 메뉴라인이 없어진다.

 

//-----------------------------

커서 바꾸기

wcex.hCursor  = LoadCursor(NULL, IDC_ARROW);

 

//-----------------------------

배경색 바꾸기

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

뒤에 +1 정수값을 바꿔주면 됨

 

//-----------------------------

 

 

 

 

 

 



 

 

 

 

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

API 개인 정리  (0) 2014.06.07
Flag성 메시지와 함수  (0) 2014.06.06
API 2일차 도형 움직이기, 총알쏘기(06.05)  (0) 2014.06.06
Posted by 눈떠보니내무실
,