진진형제 2010. 11. 8. 10:42

#include <windows.h>

HINSTANCE hInstance;

/*
이 윈도우 프로시져는 아래 WinMain에서 등록되는 "Hello2"라는 윈도우 클래스에 속하는
윈도우들의 생성과 파괴, 생성된 윈도우에서 사용자와의 인터페이스와 관련된
메시지들을 처리( handling )하는 함수입니다.

함수의 이름은 사용자가 함수를 선언하고 정의할때 임의로 작성할 수 있지만
프로토타입의 형식( 파라메타 리스트와 리턴타입 )은 그 형식을 따라야합니다.

hwnd : 윈도우 핸들
iMsg : 메시지 번호

wParam :
lParam : 메시지의 종류에 따라서 추가적인 정보를 wParma와/또는 lParam로 전달합니다.
              예)
              WM_LBUTTONDOWN이라는 메시지는 사용자가 마우스의 좌측 바튼을

              누룰 때에 발생하는 메시지입니다. 이 메시지와 더불어 좌측바튼이

              눌리워졌을 때 윈도우 클라이언트 영역상에서의 그 위치 죄표가 윈도우의

              lParam로 전달됩니다.
*/


LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
  /*
  iMsg를  case로 분기하여 처리합니다.
  여기서는 WM_DESTORY 라는 메시지만 사용자 정의로 처리하고
  나머지는 디폴트 윈도우 함수 DefWindowProc에서 처리하도록 하고 있습니다. */


 switch(iMsg)
 {
      case WM_DESTROY:
            // WM_QUIT 종료 메시지를 thread의 메시지 큐에 포스트하고 리턴합니다.
            PostQuitMessage(0);
            return 0;
 }
  return DefWindowProc(hwnd, iMsg, wParam, lParam);
}

/*
메인 윈도우
MS 윈도우의 메인함수

hInst : 응용프로그램의 현재 인스턴스에 대한 핸들
hPev : 응요프로그램의 이전 인스턴스에 대한 핸들 32 BIT 환경의 응용프로그램에서는

             항상 NULL
szCmdLine : 명령라인에서 전달된 인수에 대한 문자열
iCmdShow : 윈도우를 화면에 나타낼때 나타내는 방법(크기등)과 관련된

                      상수값으로  ShowWindow( ... )의 두번째 파라메타로 사용될 수 있습니다.
*/


int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev,LPSTR szCmdLine, int iCmdShow)
{
 static char szAppName[] ="Hello2";
 HWND hwnd;

 

 // 메시지 구조체 변수선언
 MSG msg;

 // 윈도우 클래스 구조체 변수의 선언
 WNDCLASS wndclass;

 // 인스턴스를 저장
 hInstance = hInst;

  // 윈도우 클래스 정의
 wndclass.style = CS_HREDRAW | CS_VREDRAW;

 

 // 이 윈도우 클래스에 대한 윈도우 프로시저 ( 위에서 선언된 )

 wndclass.lpfnWndProc = WndProc;
 wndclass.cbClsExtra =0;
 wndclass.cbWndExtra =0;

 

 // 이 윈도우 클래스를 생성하는 인스턴스  
 
wndclass.hInstance = hInstance;

 

 // 아이콘 로드  
 wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

 

 // 커서는 IDC_ARROW형을 채택
 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

 

 // 윈도우의 배경에 사용될 브러시  

 wndclass.hbrBackground=(HBRUSH) GetStockObject(WHITE_BRUSH);

 

 // 메뉴 이름 

 wndclass. lpszMenuName = NULL;

 

 // 윈도우 클래스 이름 
 wndclass.lpszClassName = szAppName;


 // 윈도우 클래스 등록
 if( !RegisterClass(&wndclass))
    return FALSE;

 // 윈도우 생성
 hwnd = CreateWindow (szAppName, "Hello2",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,NULL,NULL,hInstance, NULL);

 // 윈도우 나타내기
 ShowWindow(hwnd, iCmdShow);

 // 업데이트 할 것이 있다면 WM_PAINT를 통하여 업데이트한다.
 UpdateWindow(hwnd);

 // 메세지 루프 - 메시지 얻기
 while(GetMessage(&msg, NULL, 0,0))
 {
  // WM_KEYDOWN / WM_KEYUP와 같은 가상키 메시지들을 

  // W M_CHAR / WM_DEADCHAR로 번역한다.
  TranslateMessage(&msg);

  // msg 구조체의 수신자( msg.hwnd )에게 msg를 발송한다.
  DispatchMessage(&msg);
 }
  return msg.wParam;
}

BOOL

Boolean 값을 나타내는 정수 값이다. 여기서는 0이나 1의 값이 들어간다.

 

BSTR

32비트 character 포인터 값을 의미한다. 자주 보게 되지 않을 것이다.

 

BYTE

unsigned 8비트 정수 값이다. 이를 좀더 보기 쉽게 정의하면 unsingned char정도로 이해하면된다.

 

COLORREF

색상을 나타내는 32비트 값이며, 보통은 RGB매크로를 이용하여 값을 넣는다.

ex) RGB(255,255,255)

 

DWORD

32비트 unsigned 정수이며, 상당히 자주 사용되는 데이터 타입이다. 결국 unsinged int 정도로 보면 될 것이다.

 

LONG

32비트 singned 정수 값이다. ( 일반 int형도 32비트) LONGLONG형으로 사용할 경우 이 형은 double형과 같은 크기를 가지는 64비트 데이터 형이다.

 

LPARAM

32비트 값. 윈도우 프로시저 함수 같은 것에 인자로 넘어오는 데이터형 중 하나다.

 

LPCSTR

32비트 스트링 포인터인데, const형이다. 따라서 const char*정도로 보면 될 것 이다.

 

LPSTR

32비트 스트링 포인터

 

LPCTSTR

유니코드 스트링을 포인트할 수 있는 cont 32비트 스트링 포인터

 

LPTSTR

유니코드 스트링을 포이트할 수 있는 32비트 스트링 포인터

 

LPVOID

32비트 void포이터

 

LRESULT

윈도우 프로시저나 콜백함수가 리턴하는 32비트 값

 

UINT

32비트 unsigned int형

 

WNDPROC

윈도우 프로시저 함수를 포이트하는 32비트 포인터

 

WORD

16비트 unsigned int 값

 

WPARAM

LPARAM과 동일

 

POSITION

MFC collection 클래스(예:CPtrList)에서 객체를 포이트하는 값

 

LPCRECT

RECT 구조체를 포이트하는 값

 

LP라는 접두사가 붙은것은 포인터임.