본문 바로가기

[ C/ C++ 프로그래밍 ]/[ WinAPI ]

[Windows Api 정복 정리 ] WinMain & 윈도우 클래스


ㅇ WinMain

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

 - hInstance : 프로그램의 인스턴스 핸들
 - hPrevInstance : 바로 앞에 실행된 현재 프로그램의 인스턴 핸들, WIN32에서는 항상 NULL, 호환성을 위해 존재
 - lpCmdLine : 명령행, 도스의 argv인수에 해당
 - nCmdShow : 프로그램이 실행될 형태, 최소화, 보통모양이 전달
 
※ 인스턴스(Instance) :  클래스가 메모리에 실제로 구현된 실체를 의미, 실행된 프로그램 ==> 인스턴스

 

- 각 메모장은 서로 다른 인스턴스 핸들을 가지고 있다. 
- 인스턴스 핸들값으로 두개의 메모장 구별
- hInstance란  프로그램 자체를 일컫는 정수값,
- WinMain은 윈도우를 만들고 화면에 출력하기만한다.
- WndProc 에서 대부분의 일을 한다. ==> 메시지 처리 함수


ㅇ 윈도우 클래스
- 윈도우를 만들기 위해서는 윈도우 클래스를 먼저 등록한 후 CreateWindow 함수를 호출
- Window.h에 정의 되어 있는 구조체

typedef struct tagWNDCLASS
{
    UINT       style;     // 윈도우 스타일 정의
    WNDPROC      lpfnWndProc;    // 메시지 처리 함수 지정
    int            cbClsExtra;    // 예약어
    int            cbWndExtra;    // 예약어
    HINSTANCE    hInstance;    // WinMain의 인수로 전달된  hInstance값을 대입해주면 된다.
    HICON         hIcon;     // 출력 아이콘
    HCURSOR     hCursor;    // 마우스 커서
    HBRUSH        hbrBackground;   // 배경색
    LPCSTR        lpszMenuName;   // 사용할 메뉴 지정
    LPCSTR        lpszClassName;   // 윈도우 클래스 이름 지정
} WNDCLASS


ㅇ RegisterClass

   ATOM RegisterClass( CONST WNDCLASS *lpWndClass);

 - 윈도우 클래스를  정의한후 윈도우 클래스를 등록
 - 함수 인수로 WndClass 구조체의 번지를 넘겨준다.,
 
ㅇ 사용예)

 WNDCLASS WndClass; 
 
 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
 
HWND CreateWindow(lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hwndParent, hmenu, hinst, lpvParam)

 - 윈도우를 등록한 후 실제 윈도우를 생성 할때 사용
 -  lpszClassName :  생성하고자 하는 윈도우의 클래스를 지정하는 문자열,
    앞에서 정의한 WndClass 구조체의 lpszClassName 멤버의 이름을 기입 ==> 중요함
 - lpszWindowName : 윈도우의 타이틀바에 나타날 문자열
 - dwStyle : 윈도우즈 형태를 지정하는 인수
 - X, Y, nWidth, nHeight : 위치, 크기 지정
 -hWndParent : 부모 핸들 지정,  없으면 NULL
 - hmenu: 사용할 메뉴의 핸들 지정, 없으면 NULL
 - hinst : 프로그램 핸들 지정, Winmain의 인수로 전달된 hInstance를 대입
 - lpvParam: 특수 목적에 사용, 보통은 NULL
 

ㅇ ShowWIndow
 BOOL ShowWindow(hWnd, nCmdShow);
 
 - 윈도우를 화면에 보이게 한다.
 - hWnd :  CreateWindow 함수가 리턴한 핸들을 넘겨줌, 화면에 출력하고자 하는 윈도우의 핸들
 - nCmdShow : 윈도우를 화면에 출력 하는 방법
  
SW_HIDE    : 윈도우를 숨긴다.
SW_MINIMIZE    : 윈도우를 최소화시키고 활성화시키지 않는다.
SW_RESTORE   : 윈도우를 활성화시킨다.
SW_SHOW   : 윈도우를 활성화시켜 보여준다.
SW_SHOWNORMAL  : 윈도우를 활성화시켜 보여준다


ㅇ 사용 예)

hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
   CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
   NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);


ㅇ 윈도우를 만드는 과정

 


 ps : 자세한 내용은  www.WinAPI.co.kr 참고