[0322수업[ 스레드

2011. 3. 22. 00:37 from PROGRAMMING/winAPI

...

'PROGRAMMING > winAPI' 카테고리의 다른 글

[0321수업] 키보드/마우스 입력  (0) 2011.03.21
GDI  (0) 2011.03.20
[0318수업] 윈도우 메시지  (0) 2011.03.18
[0317수업] struct SCROLLINFO  (0) 2011.03.17
DC(Device Contexts)  (0) 2011.03.17
Posted by 마마필로 :

■ 키보드 메시지

키보드로부터 입력이 발생하면 윈도우즈는 포커스를 가진 프로그램에게 키보드 메시지를 보낸다.

프로그램은 이런 메시지를 받아 키보드 입력을 처리한다.

 

□ 포커스(Focus)

입력 초점. 키보드 입력을 받아 들일 수 있는 상태.

포커스를 가진 상태란 활성화 되어 있고 현재 사용자가 쓰고 있다는 뜻으로 한 번에 하나의 프로그램만 활성화된다.

멀티 태스킹이 가능한 윈도우 환경이라 하더라도 활성화 될 수 있는 프로그램은 하나 밖에 없으며,

활성화된 프로그램만 포커스를 가지고 입력 받을 수 있다.

 

□ 키보드 메시지의 종류

메시지는 시스템 메시지와 비시스템 메시지로 나뉜다.

비 시스템 메시지는 사용자가 발생시키는 메시지(WM_...로 시작)이며,

시스템 메시지는 Alt키와 함께 눌러지는 키보드 메시지로, 접두사SYS를 사용하여 운영체제가 부가적인 정보를 따라붙인다.

 

1. WM_KEYDOWN: 키보드를 누를때 모든 키에 대해 발생(Alt키, 윈도우 키, 한/영전환키 등 특수 키 제외)

2. WM_KEYUP: 키다 떨어질 때(잘 사용하지 않음)

3. WM_CHAR: 키보드로부터 문자 입력

4. WM_DEADCHAR: 유럽의 악센트 문자, 움라우트 문자 입력(이런 언어를 입력받는 프로그램을 만들지 않는 한 신경쓸 필요없음)

(시스템 메시지)

5. WM_SYSKEYDOWN

6. WM_SYSKEYUP

7.WM_SYSCHAR

8.WM_SYSDEADCHAR

 

□ 키보드 입력 처리

입력된 문자들은 WM_CHAR 메시지에서 모은다. 키보드 입력을 받는 시점(WM_CHAR)과 출력시점(WM_PAINT)이 분리되어 있으므로

입력된 문자들은 바로바로 출력하지 않고 반드시 모아야 한다.

문자를 입력받는 즉시 바로바로 출력하면 다른 프로그램에 의해 가려져 지워졌을 때 다시 복구되지 않을 것이다.

 

□ TranslateMessage

키누름 메시지(WM_KEYDOWN, WM_SYSKEYDOWN)를 문자메시지로 변환하는 작업을 한다.

WM_CHAR은 사용자에 의해 발생하는 메시지가 아니며, WM_KEYDOWN에 의해 추가로 발생하는 메시지이다.

 

 

■ 마우스 메시지

 

 

□ 주요 마우스 메시지

 

'PROGRAMMING > winAPI' 카테고리의 다른 글

[0322수업[ 스레드  (0) 2011.03.22
GDI  (0) 2011.03.20
[0318수업] 윈도우 메시지  (0) 2011.03.18
[0317수업] struct SCROLLINFO  (0) 2011.03.17
DC(Device Contexts)  (0) 2011.03.17
Posted by 마마필로 :

GDI

2011. 3. 20. 00:36 from PROGRAMMING/winAPI

...

'PROGRAMMING > winAPI' 카테고리의 다른 글

[0322수업[ 스레드  (0) 2011.03.22
[0321수업] 키보드/마우스 입력  (0) 2011.03.21
[0318수업] 윈도우 메시지  (0) 2011.03.18
[0317수업] struct SCROLLINFO  (0) 2011.03.17
DC(Device Contexts)  (0) 2011.03.17
Posted by 마마필로 :

...

'PROGRAMMING > winAPI' 카테고리의 다른 글

[0321수업] 키보드/마우스 입력  (0) 2011.03.21
GDI  (0) 2011.03.20
[0317수업] struct SCROLLINFO  (0) 2011.03.17
DC(Device Contexts)  (0) 2011.03.17
핸들(handle)  (0) 2011.03.17
Posted by 마마필로 :

■ SCROLLINFO

:스크롤 바의 페이지 크기 및 범위를 설정하는데 사용

 

■ SCROLLINFO 구조체의 역할(struct SCROLLINFO 멤버 확인-정의로 이동)

typedef struct tagSCROLLINFO
{
    UINT    cbSize;   // 구조체의 크기로 설정해야 하는 값
    UINT    fMask;  // 앞으로 설정하거나, 얻어올 값이 무엇인지 알려주는 값
    int     nMin;   // 스크롤 바의 최소 범위 값
    int     nMax;   // 스크롤 바의 최대 값
    UINT    nPage;  // 페이지크기(한 화면에 출력할 수 있는 영역)
    int     nPos;   //현재 썸의 위치
    int     nTrackPos//현재 트래킹 위치
}

 

 

 

  hdc = GetWindowDC(hWnd);
  // 비트맵을 다룰 때 생성하는 DC --> hdcmen = CreateCompatibleDC(hdc);
  // 윈도우 바깥 쪽에 출력할 때 DC -->


'PROGRAMMING > winAPI' 카테고리의 다른 글

GDI  (0) 2011.03.20
[0318수업] 윈도우 메시지  (0) 2011.03.18
DC(Device Contexts)  (0) 2011.03.17
핸들(handle)  (0) 2011.03.17
[0316수업] WndProc()함수 분석  (0) 2011.03.16
Posted by 마마필로 :

DC(Device Contexts)

2011. 3. 17. 00:32 from PROGRAMMING/winAPI

■ DC(Device Contexts)

: 출력관련 정보(폰트, 선의 색상과 굵기, 출력 방법 등)를 한꺼번에 모아 모니터/프린터 드라이버에 보내주는 구조체.

이 구조체가 없다면 모니터/프린터 출력은 모두 불가능 하므로, DC구조체에 값을 초기화 하는 것은 필수적이다.

프로그램은 DC의 값을 채워주고, 그 함수(API함수)를 호출해주면 운영체제에서 구현하여 데이터를 출력할 수 있음.

출력을 위해 반드시 DC가 있어야 하며, DC는 GDI(Graphic Device Interface) 모듈에 의해서 관리됨.

 

■ DC를 가져오는 방법(문자열 출력 시)

1. GetDC

DC는 주로 하나의 윈도우와 연관되는 출력정보를 가진다. 그래서 인수로 어떤 윈도우에 대한 DC가 필요한가를 밝혀주어야 한다.

GetDC는 hWnd가 가리키는 윈도우에 적당한 DC를 만들어 그 핸들을 반납한다.

위의 소스는 이 핸들을 HDC형의 hdc변수에 대입한 후, 이 핸들값을 TextOut 함수의 첫번째 인수로 사용하고 있다.

GetDC에 의해 얻어진 핸들은 사용 후에 반드시 ReleaseDC함수에 의해 해제되어야 한다.

DC도 메모리를 차지하므로 할당 후 해제 원칙이 반드시 준수되어야 한다.(http://www.winapi.co.kr/)

 

출력결과)

윈도우에 왼쪽 버튼을 클릭하면, 지정된 좌표(300, 200)에 "Beautiful Korea"가 출력된다.

그러나 GetDC로 만든 문자열은 다른 윈도우에 의해 사라진다.

즉, 윈도우의 크기가 변경되면 다시 마우스 왼쪽 버튼을 클릭하기 전까지 문자열은 나타나지 않는다.

윈도우에서 다른 윈도우에 의해 가려진 영역을 무효영역, 그 외 보이는 영역을 유효영역이라고 하는데,

운영체제가 화면을 보관 및 복구하지 않으므로 가려졌던 무효영역을 복구하도록 만들어 주어야 한다.

 

2. BeginPaint

 

가려졌던 문자열을 지워지지 않게 한다는 것은, 프로그램의 입장에서는 가려졌던 부분의 위치를 다시 내보내는 것이다.

PAINTSTRUCT 구조체의 멤버중 RECT가 가려져 있는 무효영역의 크기 정보를 가지고 있어 기존의 정보를 다시 가져 올 수 있게 한다.

(RECT에는 크기정보만 있을 뿐 실제 값(데이터)은 여전히 DC가 가지고 있음)

따라서 BeginPaint함수를 사용하기 위해서는 BeginPaint정보를 저장하고 있는 구조체인 PAINTSTRUCT가 반드시 필요하다.

 

문자열이 가려졌을 때마다 다시 출력되게 하기 위해서는 문자열의 출력시점을 바꿔 주어야 한다.

마우스 왼쪽 버튼을 클릭하는 메시지를 받았을 때(WM_LBUTTONDOWN) 문자열이 출력되게 했다면, 이번에는 WM_PAINT메시지를 사용해

메시지가 지워질때마다 문자열이 출력되도록 해주는 것이다.

이 때 WM_PAINT메시지 루틴에서는 DC핸들을 GetDC가 아닌 BeginPaint함수로 얻을 수 있으므로 BeginPaint함수를 사용하고, 해제는 EndPaint함수를 이용한다.

 

■ DC의 종류(types of DCs)

윈도우즈가 제공하는 DC는 그리는 표면이 어딘가에 따라 4가지 종류가 있다.

1. Display DC: Supports drawing operations on a video display

2. Printer DC: Supports drawing operations on a printer or plotter

3. Memory(or compatible) DC: Supports drawing operations on a bitmap

4. Information DC: Supports the retrieval! of device data

 

□ Display DC

BeginPaint, GetDc, GetDCEx 함수의 호출에 의해 얻을 수 있는 DC이다. 보통 클라이언트 영역(일반적으로 윈도우 창에서 내용이 보여지는 하얀 부분)에만 그려줄 때 Display DC를 받는다. 그러나 GetWindowDC함수 호출에 의해 window DC를 얻을 수 있다.

window DC는 프로그램이 윈도우 내에 어느 영역에든 그릴 수 있게 하는 DC이다.

프로그램이 그리는 것이 끝나면 즉, DC의 사용이 끝나면 반드시 EndPaint나 ReleaseDC 함수로 해제해야 한다.

 

video display를 위한 DC에도 Class/Common/Private/Window/Parent 5가지 종류가 있다.

 

 

이 중 자주 사용되는 것은 Common DC와 Private DC이다.(http://blog.naver.com/kimgudtjr/140098234234)

 

□ Printer DC

dot-matrix printer, int-jet printer, laser printer, or plotter과 같은 프린터 장치에 사용되는 Dc이다.

CreateDC 함수 호출과 프린터 드라이버의 이름, 프린터의 이름과 같은 인수를 보내 프린터 DC를 만든다.

프로그램이 프린트를 마치면, DeleteDC를 호출하여 프린터DC를 삭제한다.

ReleaseDC가 아니라 반드시 DeleteDC함수로 '해제'가 아닌, '삭제'를 해주어야 한다.

 

□ Memory DC

비트맵과 메타파일을 다루는 DC이다. 메모리 DC는 시스템이 가상 device로서 메모리 일부를 사용할 수 있게 한다.

프로그램이 일시적으로 비트맵을 위한 색상정보을 저장하는데 사용할 수 있는 메모리 내의 비트배열이다.

비트맵은 device와 호환되므로, 메모리 DC를 compatible device context라고도 한다.

 

memory DC는 CreateCompatibleDC 함수를 호출하여 만들 수 있다. 

 

□ Information DC

디폴트 device 데이타를 다시 가져오는데 사용되는 DC.


See Also
Device Context Types in msdn

'PROGRAMMING > winAPI' 카테고리의 다른 글

[0318수업] 윈도우 메시지  (0) 2011.03.18
[0317수업] struct SCROLLINFO  (0) 2011.03.17
핸들(handle)  (0) 2011.03.17
[0316수업] WndProc()함수 분석  (0) 2011.03.16
[0315수업] WinMain(), WndProc()  (0) 2011.03.15
Posted by 마마필로 :

핸들(handle)

2011. 3. 17. 00:32 from PROGRAMMING/winAPI

핸들(handle)

 

■ 구체적인 어떤 대상에 붙여진 32비트의 정수값을 가지는 번호

 

■ 만들어진 윈도우에 윈도우 핸들(hWnd)을 붙여 윈도우를 번호로 관리

  → 대상끼리의 구분을 위해서는 문자열보다 정수를 사용하는 것이 훨씬 더 속도가 빠르므로.

 

■ 윈도우즈에서 핸들은 예외없이 접두어 h로 시작

 

■ 핸들값을 저장하기 위한 별도의 데이터 형(모두 부호없는 정수형): HWND, HPEN, HBRUSH, HDC 등

 

■ 핸들의 특성

1. 정수값이며 대부분의 경우 32비트값이다.

  → 핸들을 사용하는 목적은 오로지 구분을 위한 것이므로 핸들끼리 중복되지 않아야하며 이런 목적으로는 정수형이 가장 적합하다.

 

2. 핸들은 운영체제가 발급해 주며 사용자는 쓰기만 하면 된다.

예를 들어, 윈도우를 만들거나 파일을 열면 운영체제는 만들어진 윈도우나 열려진 파일에 핸들을 붙여준다.

사용자는 이 핸들을 잘 보관해 두었다가 해당 윈도우나 파일을 다시 참조할 때 핸들을 사용하면 된다.

사용자가 직접 핸들을 만들 경우란 없다.

 

3. 같은 종류의 핸들끼리는 절대로 중복된 값을 가지지 않는다.

만약 이렇게 된다면 핸들은 구분을 위해 사용할 수 없을 것이다. 다른 종류의 핸들끼리는 중복된 값을 가질 수도 있다.

 

4. 핸들은 정수형이므로 값을 가지겠지만 그 실제값이 무엇인지는 몰라도 상관없다.

핸들은 크고 작음의 성질을 가지는 숫자가 아니라 단순한 표식일 뿐이다.

핸들형 변수를 만들어 핸들을 대입받아 쓴 후에는 버리면 된다.

 

안쓰더라도 구조체를 만들때 핸들값도 같이 만들어주는것이 좋다.->식별용이

 

 

 

 

출처: http://www.winapi.co.kr/ (API 강좌-초급강좌-'1-3-나. 핸들에 대한 이해')


'PROGRAMMING > winAPI' 카테고리의 다른 글

[0317수업] struct SCROLLINFO  (0) 2011.03.17
DC(Device Contexts)  (0) 2011.03.17
[0316수업] WndProc()함수 분석  (0) 2011.03.16
[0315수업] WinMain(), WndProc()  (0) 2011.03.15
[0314수업] Windows Programming  (0) 2011.03.15
Posted by 마마필로 :

#include <Windows.h>
#include "api0316.h"

//#define WINVER  0x0500

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

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    static TCHAR szAppName[] = TEXT("Main Window");
 HWND hWnd;
 MSG msg;
 //윈도우 정보 등록
 WNDCLASS wc;      //WNDCLASS 구조체 변수 선언

 wc.hInstance = hInstance;   //현재 윈도우 인스턴스핸들값 대입
 wc.style = CS_HREDRAW|CS_VREDRAW; //수평수직
 wc.lpfnWndProc = WndProc;   //프로시저 함수등록
 wc.cbClsExtra = 0;
 wc.cbWndExtra = 0;
 wc.hIcon = LoadIcon(NULL,IDI_APPLICATION); //리소스정보<아이콘> 등록
 wc.hCursor = LoadCursorW(NULL,IDC_ARROW);
 wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
 wc.lpszClassName = szAppName;
 wc.lpszMenuName = NULL;

 RegisterClass(&wc); //등록

 /// 핸들 정수값 반환
 hWnd = CreateWindow(szAppName,   /* 핸들 없는 상태에서 윈도우 구별하기위한 문자열 */
  TEXT("Hyojeong Window"),      /* 제목 표시줄에 표시되는 프로그램 제목*/
  WS_OVERLAPPEDWINDOW | WS_VSCROLL,    /*출력되는 윈도우의 표준 사양 & 다른 윈도우와 겹치기 가능하도록 */
  CW_USEDEFAULT, 0, CW_USEDEFAULT,0,
  NULL,        /* 상위, 부모 윈도우 핸들*/
  NULL,        /* 윈도우에 삽입 되는 메뉴표시줄 핸들*/
  hInstance,       /* 상위 인스턴스 핸들 */
  NULL);        /* 매개변수 갯수 */

 ShowWindow(hWnd,nShowCmd);
 UpdateWindow(hWnd);

 /* 현재 출력된 위치와 크기의 윈도우에서 발생되는 윈도우 메세지를*/
 /* 윈도우 메시지 처리함수로 잔달..*/
 /* WM_QUIT 메세지들어 왔을때 루프나와서 WinMain 함수 리턴 - 종료 */
 /* WM_QUIT 메세지가 들어와야 메모리에서 내려온다.*/
 while(GetMessage(&msg,NULL,0,0))
 {
  TranslateMessage(&msg); /* 메시지 번역 */
  DispatchMessage(&msg);  /* OS로 메시지 큐에 저장된 구조체 번지값 전달 */
  /* 메세지 정보는 큐 */
 }
 return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 static int cxChar, cyChar, cxCaps;   //정적선언으로 ReleaseDC 때 값 사라짐 방지

 HDC hDC;   //화면 출력용 구조체[1]
 PAINTSTRUCT ps;  //화면 출력용 구조체[2]
 TEXTMETRIC tm;      //문자 가로 세로 사이즈 정보
 TCHAR szBuffer[10]; // 문자열을 저장하는 변수는 관례적으로 다 sz를 붙임
 // string terminated by zero character
 // =WCHR = wchr_t 즉 문자 한 글자를 저장하기위해 2바이트(16bit)
 static int cxClientWidth,cyClientHeight;

 switch (message)
 {
 case WM_CREATE:
  hDC = GetDC(hWnd);
  GetTextMetrics(hDC,&tm);
  cxChar = tm.tmAveCharWidth;        //소문자 평균폭
  cxCaps = (tm.tmPitchAndFamily & 1?3:2) * cxChar /2;  //대문자 평균폭
  cyChar = tm.tmHeight + tm.tmExternalLeading;
  ReleaseDC(hWnd,hDC); //DC 해제

  SetScrollRange(hWnd, SB_VERT, 0, NUMLINES-1, FALSE); // 수직 스크롤 범위 지정
  //SetScrollRange(hWnd, SB_HORZ, 0, 75*cxChar, FALSE); // 수평 스크롤 범위 지정
  SetScrollPos(hWnd, SB_VERT, 0, TRUE);
  return 0;
 case WM_PAINT:  // View 영역이 출력될때
  hDC = BeginPaint(hWnd,&ps);
  for(int i=0;i<NUMLINES;i++)
  {
   TextOut(hDC,1,cyChar*i,sysmetrics[i].szLabel,lstrlen(sysmetrics[i].szLabel));
   //(hDC, 10=x값(10픽셀),cyChar(=높이)*i, sysmetrics구조체의 0번째 문자열을 가져옴, lstrlen(문자열의 전체길이값을 정수형태로 리턴받아옴))
   TextOut(hDC,20*cxChar,cyChar*i,sysmetrics[i].szDesc,lstrlen(sysmetrics[i].szLabel));

   SetTextAlign(hDC,TA_RIGHT|TA_TOP);//TA_RIGHT:flag TA(Text Align) -> 오른쪽정렬하면서 위로 붙임

   TextOut(
    hDC,
    70 * cxChar, // 폭
    cyChar*i,
    szBuffer,  //
    wsprintf(szBuffer,TEXT("%5d"),GetSystemMetrics(sysmetrics[i].iIndex))  //
    );

   SetTextAlign(hDC,TA_LEFT|TA_TOP); // 왼쪽정렬로 되돌려 줌
  }
  EndPaint(hWnd,&ps); // for문이 끝나면 Paint끝.
  return 0;
 case WM_SIZE:
 //cxClientWidth = LOWORD(lParam); //WndProc의 4번째 변수 사용/수평스크롤 만들었을 때 사용
 cyClientHeight = HIWORLD(lParam);
 return 0;
 case WM_VSCROLL:
  switch(LOWORD(wParam))
  {
  case SB_LINEUP:
   iVScrollPos -= 1;
   break;
  case SB_LINEDOWN:
   iVScrollPos += 1;
   break;
  case SB_PAGEUP:
   iVScrollPos -= cyClientHeight / cyChar;
   break;
  case SB_PAGEDOWN:
   iVScrollPos += cyClientHeight /cyChar;
   break;
  case SB_THUMBPOSITION:
   iVScrollPos = HIWORD(wParam);
   default :
   break;
  }
  iVScrollPos = max(0, min(iVScrollPos, NUMLINES -1));
  if(iVScrollPos != GetScrollPos(hWnd, SB_VERT))
  {
   SetScrollPos(hWnd, SB_VERT, iVScrollPos, TRUE);
   InvalidateRect(hWnd, NULL, TRUE);
  }
  return 0;
 case WM_DESTROY:
  PostQuitMessage(0);
  return 0;
 }
 /* 나머지 메시지 처리 */
 return DefWindowProc(hWnd,message,wParam,lParam);
}

'PROGRAMMING > winAPI' 카테고리의 다른 글

[0317수업] struct SCROLLINFO  (0) 2011.03.17
DC(Device Contexts)  (0) 2011.03.17
핸들(handle)  (0) 2011.03.17
[0315수업] WinMain(), WndProc()  (0) 2011.03.15
[0314수업] Windows Programming  (0) 2011.03.15
Posted by 마마필로 :

[Win API의 두가지 주요함수]

 

■ WinMain()

1. 역할

-윈도우 프로그램의 시작점

-표준 윈도우 요소(view, title bar, frame)만을 가진 윈도우 하나를 화면에 출력(출력사양을 결정할 수 있음)

-API 함수(API 구조) : 윈도우 사양을 결정하게 하는 구조체를 가져와 WinMain함수의 구조체에 값을 채우고 OS로 보내서 실행

 

2. 함수의 원형(Win Main의 원형은 고정되어 있음)

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

 

2.1 WinMain함수의 인수별 의미

1) hInstance : 프로그램의 인스턴스 핸들.

프로그램 자체를 일컫는 정수값(OS가 P/G쪽으로 발급해주는 프로그램전체의 고유번호)

2) hPrevInstance: 바로 앞에 실행된 현재 프로그램의 인스턴스 핸들. 없을 경우는 NULL. WIN32에서는 항상 NULL.

호환성을 위해서만 존재하는 인수이므로 신경쓰지 않아도 된다.

3) lpCmdLine : 명령행으로 입력된 프로그램의 인수

4) nCmdShow : 프로그램이 실행될 형태이며 최소화, 보통모양 등이 전달됨

 

→ 실제, hInstance이외에는 잘 사용되지 않는다.

 

□ 인스턴스(Instance): 클래스가 메모리에 실제로 구현된 실체.

윈도우즈용 프로그램은 한번에 여러개 동시실행, 하나의 프로그램이 여러번 실행이 가능한데, 이때 실행되고 있는 각각의

프로그램을 인스턴스라고 하는데, 같은 프로그램이라고 하더라도, 운영체제는 각각 다른 메모리를 사용하는 다른 인스턴스로

구분한다.

 

 

■ WndProc()

1. 역할 : 메시지 처리 함수

 

2: WndProc함수의 원형(WinMain의 바로 위에 선언)

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


See Also
두가지 주요함수를 이용한 기본코드 작성

'PROGRAMMING > winAPI' 카테고리의 다른 글

[0317수업] struct SCROLLINFO  (0) 2011.03.17
DC(Device Contexts)  (0) 2011.03.17
핸들(handle)  (0) 2011.03.17
[0316수업] WndProc()함수 분석  (0) 2011.03.16
[0314수업] Windows Programming  (0) 2011.03.15
Posted by 마마필로 :

■ 콘솔 어플리케이션 vs. 윈도우 어플리케이션

1. 콘솔 어플리케이션

메인 함수에서 시작해 실행 후 메인함수로 돌아와 종료.

즉, 프로그래머가 결정해 둔 순서대로 실행 됨.

 

2. 윈도우 어플리케이션

메시지를 받아서 처리. 사용자가 클릭하는 이벤트에 따라 함수 실행. 함수의 진행순서라는 개념이 없어지므로,

함수가 순서대로 실행된다는 관점을 버려야 함.

 

→ 함수의 호출순서가 큰 의미가 없다.

→ 반드시 함수의 존재가 호출되지는 않는다.

→ 콘솔의 경우 프로그램의 실행이 끝날때까지 프로그램이 제어권을 가지고 있으나,

윈도우의 경우 응용프로그램과 운영체제 간 계속해서 제어권을 주고 받는다.

제어권을 제 시간에 넘겨주지 못하는 경우 발생하는 것이 '응답없음'.

 

■ 윈도우 프로그래밍을 위해서는,

1. 리소스(그림파일+메뉴, 소리 등) 다루기

2. Boiler Plate(개발도구에서 기본적으로 제공해주는 코드) 이해

3. 사용자 정의된 함수를 조직화 시킬줄 알아야 함

 

■ API(Application Programming Interface)란?

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

 

응용프로그램 → 운영체제 → 하드웨어

 

운영체제: 응용프로그램과 하드웨어 사이에서, 응용 프로그램을 대신하여 하드웨어와 메모리 관리

응용프로그램을 만드는 프로그래머들은 운영체제의 표준규칙에 따라 프로그램을 만들고 하드웨어에 액세스할 수 있도록 해야한다.

이를 위해, 운영 체제는 기본적인 동작을 위한 함수의 집합을 응용 프로그램에게 제공하며,

응용 프로그램 개발자들은 운영체제가 제공하는 함수들을 사용한다.

이러한 응용 프로그램을 위한 함수 집합을 API라고 한다.

 

윈도우즈에서 제공하는 API를 윈도우즈 API라고 하지만, 요즘은 일반적으로 API라고 하면 윈도우즈 API를 일컫는다.

비슷한 말로 SDK(Software Development Kit)라는 표현이 사용되기도 한다.

 

cf.)

□ 이벤트 처리기: 버튼을 눌렀을 때 실행되는 함수(버튼에 반응하는 함수)

□ 진입점 함수의 호출 주체는 항상 운영체제

□ 정적라이브러리(.lib): 실행 시켰을 때 실행파일과 같이 메모리에 로드되어 있음

□ 동적라이브러리(.dll): 호출 시점에 메모리에 올라갔다 끝나면 내려옴


'PROGRAMMING > winAPI' 카테고리의 다른 글

[0317수업] struct SCROLLINFO  (0) 2011.03.17
DC(Device Contexts)  (0) 2011.03.17
핸들(handle)  (0) 2011.03.17
[0316수업] WndProc()함수 분석  (0) 2011.03.16
[0315수업] WinMain(), WndProc()  (0) 2011.03.15
Posted by 마마필로 :