본문 바로가기

[PROGRAMMING]/▶Window System Programming

win32 base code 기본 코드

#include<windows.h>
#include<tchar.h>

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
LPWSTR lpszClass=L"ApiBase";

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow)
{
 HWND hWnd;
 MSG Message;
 WNDCLASS WndClass;
 g_hInst = hInstance;

 //클래스를 등록한다 ex) 인스턴스 핸들 : 메모리에 생성된 클래스의 실체 , 내방의 여러가지 물건(객체) 존재하고있는 모든 물건들이 클래스이다.
 //객체=물건 , 클래스 = 물건들, 클래스들의 집합 = 인스턴스 핸들(메모리에 실제로 올라온것)

 /************* 윈도우 클래스만들기 ****************/
 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)WndProc;                                      //프로시저 함수명
 WndClass.lpszClassName = lpszClass;                                                 //구조체로 만들어질 클래스명
 WndClass.lpszMenuName = NULL;                                                        //프로그램에서 사용할 메뉴
 WndClass.style = CS_HREDRAW | CS_VREDRAW;                                    //윈도우 스타일
 
 /************윈도우 클래스 등록********************/
 RegisterClass(&WndClass);

 /*************윈도우 객체 생성*********************/
 //CreateWindow로 객체를 생성하고 인트형 handle을 반환한다.
 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,0,0,0))
 {
  TranslateMessage(&Message);  //WM_KEYDOWN,WM_CHAR,WM_KEYUP세가지 메세지 발생, GetMessage함수로 읽어드린 이벤트를 이 함수가 문자가 입력됬는지 검사하고 입력됬으면 WM_CAHR 생성하고, 문자입력이 없으면 DispatchMessage로 넘김.
  DispatchMessage(&Message);  //GetMessage함수로부터 전달된 메세지를 윈도우 프로시저로 전달하는 역할을한다.
 }
 //키보드 입력(이벤트발생) -> 운영체제(시스템큐) -> 애플리케이션큐(프로그램버퍼) -> winmain()(메세지루프) -> WndProc()(윈도우프로시저)
 //SendMessage : 위의 과정을 무시하고 윈도우 프로시저 함수로 바로전달되며 메세지 전달하는 역할은 이 함수가한다. 완전히 처리되기전까지 반환되지 않는다.
 //PostMessage : 위와 같음. 이 함수로 메시지를 보내면 곧바로 반환됨,해당 메세지를 붙인 스레드는 다른작업 가능함. 비동기적으로 처리시 유용함.
 return Message.wParam;

 //MSG message 원형
 /* typedef struct tagMSG
    {
   HWND hWnd;               이벤트가 발생한 윈도우 핸들
   UINT message;            이벤트 메시지 종류
   WPARAM wParam;       부가정보
   LPARAM lParam;         부가정보
   DWORD time;               이벤트 접수된 시각
   POINT pt;                    이벤트가 발생한 위치(좌표)
  }*/
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 switch(iMessage)
 {
 case WM_DESTROY:
  PostQuitMessage(0);

 }

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

}