'Programming/Windows API'에 해당하는 글 9건

WndProc

Programming/Windows API 2006. 10. 27. 20:18
WndProc

메시지 처리 함수란 메시지가 발생할 때 프로그램의 반응을 처리하는 일을 하며 WinMain 함수와는 별도로 WndProc 라는 이름으로 존재한다.
윈도우 프로시저(Window Procedure)라는 뜻이고 통상 "윈드프록" 이라고 읽는다.
WndProc 은 WinMain 에서 호출하는게 아니라 윈도우즈에 의해 호출된다.
메시지가 입력되면 윈도우즈에 의해 WndProc 이 호출되어 메시지를 처리한다.
이렇게 운영체제에 의해 호출되는 응용 프로그램내의 함수를 콜백(CallBack) 함수라고 한다.

WndProc의 인수는 4개이며 MSG 구조체의 멤버 4개와 동일하다.
WndProc의 구조는 대체로 다음과 같은 형태를 가지고, 메시지의 종류에 따라 다중 분기하여 메시지별로 처리를 진행한다.

switch ( iMessage )
{
  case Msg1:
    처리1;
    return 0;
  case Msg2:
    처리2;
    return 0;
  case Msg3:
    처리3;
    return 0;
  default:
    return DefWindowProc(...);
}

DefWindowProc 함수는 WndProc 에서 처리하지 않은 나머지 메시지에 대해 디폴트 처리를 해 준다. WinProc 은 메시지를 처리했을 경우 반드시 0을 리턴해 주어야 한다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

MSG

Programming/Windows API 2006. 10. 27. 20:13
MSG

실제 메시지 처리는 별도의 메시지 처리 함수(WndProc)에서 수행한다.
메시지는 시스템의 변화에 대한 정보이며 MSG 라는 구조체에 보관된다.

typedef struct tagMSG
{
  HWND  hwnd;
  UINT  message;
  WPARAM  wParam;
  LPARAM  lParam;
  DWORD  time;
  POINT  pt;
} MSG;

hwnd
메시지를 받을 윈도우 핸들이다.

message
어떤 종류의 메시지인가를 나타낸다.

wParam
32비트 값이며 전달된 메시지에 대한 부가적인 정보를 가진다.
어떤 의미를 가지는가는 메시지별로 다르다.

lParam
32비트 값이며 전달된 메시지에 대한 부가적인 정보를 가진다.
어떤 의미를 가지는가는 메시지별로 다르다.

time
메시지가 발생한 시간이다.

pt
메시지가 발생했을 때의 마우스 위치이다.

message 멤버를 읽고 메시지의 종류를 파악하며 그 값에 따라 프로그램의 반응이 다르다.
메시지는 windows.h 에 메시지별로 매크로 상수를 정의되어 있으며 WM_ 로 시작된다.
  • WM_QUIT
    프로그램을 끝낼 때 발생하는 메시지이다.
  • WM_LBUTTONDOWN
    마우스의 좌측 버튼을 누를 경우 발생한다.
  • WM_CHAR
    키보드로부터 문자가 입력될 때 발생한다.
  • WM_PAINT
    화면을 다시 그려야 할 필요가 있을 때 발생한다.
  • WM_DESTROY
    윈도우가 메모리에서 파괴될 때 발생한다.
  • WM_CREATE
    윈도우가 처음 만들어질 때 발생한다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,
Message Loop

윈도우즈는 메시지 구동 시스템(Message Driven System)이다.
메시지란 사용자나 시스템 내부적인 동작에 의해 발생된 일체의 변화에 대한 정보이다.
순서를 따르지 않고 주어진 메시지에 대한 반응을 정의하는 방식으로 프로그램이 실행된다.

윈도우즈 프로그램에서 메시지를 처리하는 부분을 메시지 루프라고 한다.
메시지 루프는 메시지 큐에서 메시지를 꺼내 메시지 처리 함수로 보낸다.
보통 WinMain 함수의 끝에 다음과 같은 형식으로 존재한다.

while ( GetMessage( &Message, 0, 0, 0 ) ) {
  TranslateMessage( &Message );
  DispatchMessage( &Message );
}

BOOL GetMessage( LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, wMsgFilterMax );

시스템이 유지하는 메시지 큐에서 메시지를 읽어들인다.
읽어들인 메시지는 첫번째 인수가 지정하는 MSG 구조체에 저장된다.
읽어들인 메시지가 프로그램을 종료하라는 WM_QUIT 일 경우 False 를 리턴하고, 그 외의 메시지이면 True 를 리턴한다.
즉 프로그램이 종료될 때까지 전체 while 루프가 계속 실행된다.

BOOL TranslateMessage( CONST MSG *lpMsg );

키보드 입력 메시지를 가공하여 프로그램에서 쉽게 쓸 수 있도록 해준다.

LONG DispatchMessage( CONST MSG *lpMsg );

시스템 메시지 큐에서 꺼낸 메시지를 프로그램의 메시지 처리 함수(WndProc)로 전달한다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,

ShowWindow

Programming/Windows API 2006. 10. 26. 19:45
ShowWindow

CreateWindow 함수로 만든 윈도우는 메모리상에서만 존재하므로 출력을 하려면 ShowWindow 함수를 사용해야 한다.

BOOL ShowWindow( hWnd, nCmdShow );

hWnd
화면으로 출력하고자 하는 윈도우의 핸들이며 CreateWindow 함수가 리턴한 핸들을 그대로 넘겨주면 된다.

nCmdShow
윈도우를 화면에 출력하는 방법을 지정하며 다음과 같은 매크로 상수들이 정의되어 있다.
(WinMain 함수의 인수로 전달된 nCmdShow를 그대로 넘겨주기만 하면 된다.)
  • SW_HIDE
    윈도우를 숨긴다.
  • SW_MINIMIZE
    윈도우를 최소화시키고 활성화시키지 않는다.
  • SW_RESTORE
    윈도우를 활성화시킨다.
  • SW_SHOW
    윈도우를 활성화시켜 보여준다.
  • SW_SHOWNORMAL
    윈도우를 활성화시켜 보여준다.

♣ 윈도우를 만드는 과정
  • WndClass 정의
    윈도우의 기반이 되는 클래스를 정의한다.
  • CreateWindow
    메모리상에 윈도우를 만든다.
  • ShowWindow
    윈도우를 화면에 표시한다.
  • 메시지 루프
    사용자로부터의 메시지를 처리한다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,
CreateWindow

윈도우 클래스를 등록한 후에는 등록한 윈도우 클래스를 기본으로 윈도우를 실제 생성해야 한다.
윈도우를 생성할 때는 CreateWindow 함수를 사용한다.

HWND CreateWindow( lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hwndParent, hmenu, hinst, lpvParam )

lpszClassName
생성하고자 하는 윈도우의 클래스를 지정하는 문자열이다.
WndClass 구조체의 lpszClassName 멤버의 이름을 여기에 기입한다.

lpszWindowName
윈도우의 타이틀 바에 나타날 문자열이다.

dwStyle
만들고자 하는 윈도우의 형태를 지정하는 인수이다.
일종의 비트 필드값이며 매크로 상수들이 정의되어 있고, 이 상수들을 OR 연산자로 연결하여 윈도우의 다양한 형태를 지정한다.
WS_OVERLAPPEDWINDOW 를 사용하면 가장 기본적인 윈도우 설정 상태가 된다.
(시스템 메뉴, 최대 최소 버튼, 타이틀 바, 경계선을 가진 윈도우)

X, Y, nWidth, nHeight
윈도우의 위치와 크기를 지정하며 픽셀 단위를 사용한다.
x, y 좌표는 메인 윈도우의 경우 전체 화면을 기준으로 하며 자식 윈도우는 부모 윈도우의 좌상단을 기준으로 한다.
정수값을 바로 지정해도 되고, CW_USEDEFAULT를 사용하면 윈도우즈가 알아서 적당한 크기와 위치를 설정해 준다.

hWndParent
부모 윈도우가 있을 경우 부모 윈도우의 핸들을 지정해 준다.
윈도우끼리 상하관계(parent-child)를 지정해 주는 인수이다.
부모 윈도우가 없을 경우는 NULL로 지정한다.

hmenu
윈도우에서 사용할 메뉴의 핸들을 지정한다.
이 인수를 NULL로 지정하면 WndClass 에서 지정한 메뉴를 그대로 사용한다.

hinst
프로그램의 핸들을 지정한다.
WinMain의 인수로 전달된 hInstance를 대입한다.

lpvParam
CREATESTRUCT 구조체의 번지이며 특수한 목적에 사용횐다.
보통 NULL 값을 사용한다.

이 함수는 윈도우에 관한 모든 정보를 메모리에 만든 후 윈도우 핸들을 리턴값으로 넘겨준다.
넘겨지는 윈도우 핸들은 hWnd 라는 지역 변수에 저장되었다가 윈도우를 참조하는 모든 함수의 인수로 사용된다.

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

,