728x90

 Win32 API 프로그램의 작성 순서 6단계

 

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

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

3단계 : 윈도우 생성

4단계 : 윈도우 출력

5단계 : 메시지 루프

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

 

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

 

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

 원형

 ATOM RegisterClassEx(__in CONST WNDCLASSEX *lpwcx

 설정

 RegisterClass(&WndClass);

 

3단계 : 윈도우 생성

윈도우를 생성하고 윈도우 핸들(HWND)을 받는 단계

HWND CreateWindow(     LPCTSTR lpClassName,     //  등록한 구조체 이름                                                   

LPCTSTR lpWindowName, // 메뉴위 타이틀 이름

DWORD dwStyle,       //윈도우 창 모양(윈도가 가지는 모든 모양)     
int x,                    //윈도우 화면 시작좌표 x

int y,                    //윈도우 화면 시작좌표 y

int nWidth,            //윈도우 가로 사이즈

int nHeight,            //윈도우 세로 사이즈
HWND hWndParent, //차일드 윈도일때 부모 윈도우 명시

HMENU hMenu,            //메뉴

HINSTANCE hInstance, //프로그램 자체를 일컫는 정수값=자기 자신을 가리키는 1인칭 대명사

LPVOID lpParam                 // 사용하지 않는 부분 0의 값입력                       

);

 

 

4단계 : 윈도우 출력

BOOL ShowWindow(HWND hWnd, nCmdShow); // nCmdShow 는 함수가 리턴한 핸들을 그대로 넘김

/*

SW_HIDE 윈도우를 숨긴다.

SW_MINIMIZE 윈도우를 최소화하고 활성화시키지 않는다.

SW_RESTORE 윈도우를 활성화시킨다.

SW_SHOW 윈도우를 활성화하여 보여준다.

SW_SHOWNORMAL 윈도우를 활성화하여 보여준다.

*/

 

BOOL UpdateWindow(HWMD hWnd);

 

5단계 : 메시지 루프

BOOL GETMESSAGE(

LPMSG lpMsg,        //아래 MSG 포인터 구조체 참고

HWMD hWnd,            //핸들

UINT wMsgFilterMin,    //받고자 하는 메세지 범위 보통 0 모든 메세지를 받겠다는 뜻

UINT wMsgFilterMax    //받고자 하는 메세지 범위 보통 0 모든 메세지를 받겠다는 뜻

);

 

BOOL TranslateMessage(                // 키입력 메세지 처리

const MSG *lpMsg

);

 

LRESULT DispatchMessage(            // 메세지가 발생한것을 처리해 달라고 WinProc 함로 넘김

const MSG *lpmsg

); 

 

typedef struct{

HWND     hwnd;

UINT      message;

WPARAM wParam;

LPARAM lParam;

DWORD time;

POINT pt;

}MSG, *PMSG;

 

6단계 : 윈도우 메시지 처리 함수인 WindProc()의 작성

 

윈도우 메시지 (WinUser.h)

#define WM_SETFOCUS

#define WM_KILLFOCUS

#define WM_ENABLE

#define WM_SETREDRAW

#define WM_SETTEXT

#define WM_GETTEXT

#define WM_GETTEXTLENGTH

#define WM_PAINT

#define WM_CLOSE

 

WndProc() 함수의 기본구조

LRESULT CALLBACK WndProc(HWND hWnd,    

UINT iMessage,

WPARAM wParam,

LPARAM lParam)

 

HWND     // void *형

typedef LONG_PTR LRESULT;     // long 형

typedef long LONG_PTR;            //

typedef LONG_PTR LPARAM;    // long 형

typedef UINT_PTR WPARAM;    // unsigned int 형

typedef unsigned int UINT_PTR;    //

 

WndProc() 함수의 기본예제

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
  switch
 (iMessage) {
  case
 WM_DESTROY:
       PostQuitMessage(0); // WinMain 함수를 빠져 나오는 메시지

break;

default:

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

  }
}return 0;

 

 ☞ 중용한 윈도우 메시지

 메시지

                   설 명

 WM_CREATE

 CreateWindow() 또는 CreateWindowEx() 함수에 의해 윈도우가 생성 되었을때 발생 하는 메시지

 WM_SIZE

 사용자가 윈도우의 크기를 변경한 후에 발생되는 메시지

 WM_MOVE

 사용자가 우니도우를 이동시킨 우에 발생되는 메시지

 WM_PAINT

 윈도우의 클라이언트 영역의 일부를 새로이 그려야 하는 경우에 발생

 WM_CHAR

 문자키(알파벳과 술자키)가 눌렸을 때 발생되는 메시지 통해 대소문자 구분

 WM_KEYDOWN

 키보드가 눌렸을 때 발생하는 메시지

 

 WM_DESTROY

 윈도우가 화면으로부터 사라지고 메모리에서 해제되기 직전에 발생되는 메시지 이다

 WM_MOUSEMOVE

 마우스가 이동하면 계속 발생되는 메시지

 WM_LBUTTONDOWN

 마우스의 왼쪽 버튼이 눌렸을 때 발생되는 메시지.

 단 마우스의 커서는 윈도우의 클라이언트 영역안에 있어야 한다.

 WM_CLOSE

 윈도우가 종료될 때 발생하는 메시지로 '닫기' 버튼을 클릭하면 발생된 메시지 보다

 WM_DESTROY 메시지 보다 이전에 발생되는 메시지이다.

 WM_QUIT

 응용 프로그램을 종료할 때 발생되는 메시지로 PostQuitMessage() 함수에 의해 발생된다.

 이 메시지는 GetMessage()의 리턴값을 0으로 만든다.

 이 메시지는 WinMain()에서만 받을 수 있다.

 

 

 

 

 전체적인 구조와 코드

#include <windows.h>

 

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass
=TEXT("First"
);

int
 APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
      ,LPSTR lpszCmdParam,int
 nCmdShow)
{
  HWND hWnd;
  MSG Message;
  WNDCLASS WndClass;
  g_hInst
=
hInstance;
  
  WndClass.cbClsExtra
=0
;
  WndClass.cbWndExtra=0
;
  WndClass.hbrBackground=
(HBRUSH)GetStockObject(WHITE_BRUSH);
  WndClass.hCursor=
LoadCursor(NULL,IDC_ARROW);
  WndClass.hIcon=
LoadIcon(NULL,IDI_APPLICATION);
  WndClass.hInstance=
hInstance;
  WndClass.lpfnWndProc=
WndProc;
  WndClass.lpszClassName=
lpszClass;
  WndClass.lpszMenuName=
NULL;
  WndClass.style=CS_HREDRAW |
 CS_VREDRAW;
  RegisterClass(&
WndClass);

  hWnd=
CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
    NULL,(HMENU)NULL,hInstance,NULL);
  ShowWindow(hWnd,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
;
  }
  return
(DefWindowProc(hWnd,iMessage,wParam,lParam));
}