.NET API WINDOW

IT/개발공부 / / 2020. 9. 4. 17:16
728x90
반응형

윈도우 생성 단계 

아래 링크에 있는 WinMain 함수에서 하는 가장 중요한 일은 윈도우를 생성하는 일입니다. Console Application은 콘솔창을 통해서 사용자로 부터 입력을 받고 출력물을 내보냅니다. 하지만 WIndow Application은 콘솔창이 생성되지 않습니다. 사용자로 부터 입력을 받거나 출력물을 내보내기 위해서 윈도우를 생성해야 합니다. 그리고 윈도우를 생성하기 위해서 반드시 거쳐야 하는 절차가 있습니다.

 

API WinMain

 

API WinMain

tWinMain 윈도우 API 예제를 만들어보겠습니다. 프로그램의 시작점인 엔트리 포인트 함수를 분석해 보고자 합니다. #include #include int WINPAI_tWinMain( HINSTANCE hinst, HINSTANCE hPrev, LPTSTR IpCmdLine..

kkunja.tistory.com

 

윈도우 생성 단계

윈도우 클래스 만들기

모든 윈도우는 윈도우 클래스로부터 만들어 집니다.

 

윈도우를 만들기 위해서는 윈도우 클래스를 먼저 만들어야 합니다. 윈도우 클래스는 윈도우 특징(배경, 아이콘, 커서 등)을 정의하는 구조체이며 winuser.h에 아래와 같이 정의되어 있습니다. 또한 만들어진 윈도우 클래스는 시스템에 등록하여야만 사용할 수 있습니다. 결국 하나의 윈도우를 만들기 위해서는 윈도우 클래스 생성 및 등록과정을 거쳐야 합니다.

 

윈도우 클래스를 만들기 위해서는 WNDCLASS 와 WNDCLASSEX 를 사용할 수 있으며 후자는 확장된 구조체입니다.

 

/*winuser.h ****************/

typedef struct tagWNDCLASSEXW {
 UINT cbSize;
 /* Win 3.x */
 UINT style;
 WNDPROC lpfnWndProc;
 int cbClsExtra;
 int cbWndExtra;
 HINSTANCE hInstance;
 HICON hIcon;
 HCURSOR hCursor;
 HBRUSH hbrBackground;
 LPCWSTR lpszMenuName;
 LPCWSTR lpszClassName;
 /* Win 4.0 */
 HICON hIconSm;
} WNDCLASSEXW, *PWNDCLASSEXW, NEAR *NPWNDCLASSEXW, FAR *LPWNDCLASSEXW;
…

#ifdef UNICODE
typedef WNDCLASSEXW WNDCLASSEX;
#else

해당 구조체는 12개나 되는 멤버를 가지고 있습니다. 각 멤버의 의미는 다음과 같습니다.

cbSize : 구조체 크기를 지정합니다.

style : 윈도우 스타일을 정의합니다. 이 멤버가 가질 수 있는 값은 많지만 가장 많이 사용하는 값이 CS_HREDRAW와 CS_VREDRAW 입니다. 이 두값을 OR 연산자로 연결하여 사용합니다. 이 스타일은 윈도우 수직크기가 변경 될 경우 윈도우를 다시 그린다는 뜻입니다.

 

IpfnWndProc : 윈도우의 메시지 처리 함수를 지정합니다. 해당 함수 이름은 마음대로 정할 수 있지만 관습적으로 WndProc 이라는 이름을 사용합니다. 윈도우 프로시저는 메시지가 발생할 때마다 호출되는 함수이며 모든 메시지를 처리하게 됩니다.

 

cbClsExtra : 클래스 정보를 저장할 수 있는 예약 영역입니다. 사용하지 않을 경우는 0으로 지정합니다.

 

cbWndExtra : 윈도우 정보를 저장할 수 있는 예약 영역입니다. 사용하지 않을 경우 0으로 지정합니다.

 

hInstance : 윈도우 프로시저를 담은 모듈의 핸들이며 WinMain의 첫번째 인자로 전달된 값을 대입하면 됩니다.

 

hIcon : 윈도우에서 사용할 큰 아이콘의 핸들을 지정합니다. LoadIcon 함수를 사용하여 아이콘을 읽어와 대입합니다. 이때 읽어오는 정보는 사용자가 직접 만든 아이콘이나 윈도우가 디폴트로 제공되는 아이콘을 사용할 수 있습니다.

 

hCursor : 윈도우에서 사용할 커서를 지정합니다. LoadCursor 함수를 사용하여 커서를 읽어와 대입합니다. 이 때 읽어오는 정보는 사용자가 직접 만든 커서나 윈도우가 디폴트로 제공되는 커서를 사용할 수 있습니다.

 

hbrBackground : 윈도우의 배경 색상을 표현하기 위한 브러쉬를 지정합니다. 사용자가 직접 만들 브러쉬를 사용할 수 있고 윈도우에서 기본적으로 제공되는 브러쉬를 사용할 수 있습니다.

 

IpszMenuName : 윈도우에 부착할 메뉴를 지정합니다. 메뉴는 일반적으로 리소스 에디터에 의해 별도로 만들어집니다. 사용하지 않을 경우 NULL로 지정합니다.

 

IpszClassName : 윈도우 클래스의 이름을 문자열로 지정합니다. 해당 이름은 윈도우가 생성될 때 원하는 클래스 정보를 가져오는 키가 됩니다.

 

hIconSm : 윈도우에서 사용할 작은 아이콘을 지정합니다. 0을 지정하면 큰 아이콘을 축소해서 사용합니다. 

 

윈도우 클래스 등록하기

윈도우 클래스 구조체를 정의하였다면 RegisterClassEx 함수를 호출하여 윈도우 클래스를 등록합니다. 어떠한 윈도우 클래스 구조체로 정의 하였는지에 따라 적절한 함수를 사용합니다.

 

해당 함수는 ATOM 값을 리턴하는 데 실패할 경우 0을 리턴합니다. 리턴된 값은 윈도우를 생성할 때 사용될 수 있으나, 일반적으로 WNDCLASSEX 구조체 멤버인 IpszClassName을 사용합니다.

 

아래 함수는 모두 등록에 실패할 경우 0을 리턴합니다.

// typedef WORD ATOM;
ATOM RegisterClass( CONST WNDCLASS *lpwndClass);
ATOM RegisterClassEx(CONST WNDCLASSEX* lpwcx);

 

윈도우 만들기

윈도우 클래스를 등록한 후에는 등록한 윈도우 클래스를 기본으로 아래 함수를 호출하여 윈도우를 생성합니다.

HWND CreateWindowW(
_In_opt_ LPCWSTR lpClassName,
 _In_opt_ LPCWSTR lpWindowName,
 _In_ DWORD dwStyle,
 _In_ int X,
 _In_ int Y,
 _In_ int nWidth,
 _In_ int nHeight,
 _In_opt_ HWND hWndParent,
 _In_opt_ HMENU hMenu,
 _In_opt_ HINSTANCE hInstance,
 _In_opt_ LPVOID lpParam);

#ifdef UNICODE
#define CreateWindow CreateWindowW
#else
#define CreateWindow CreateWindowA
#endif // !UNICODE

 

IpClassName : 윈도우 클래스 이름을 지정합니다.

 

IpWindowName : 윈도우 캡션바에 나타낼 문자열을 지정합니다.

 

dwStyle : 만들고자 하는 윈도우의 형태를 지정합니다. 다양한 상수가 정의되어 있고 OR 연산자를 사용하여 선택하여 사용합니다. 정의된 내용은 크기 조절 가능여부 , 타이틀 바 생성 여부 , 스크롤 바 유무 등이 있습니다.

 

x, y, nWidth, nHeight : 윈도우의 위치(x,y)와 크기(nWidth, nHeight)를 지정하며 픽셀 단위를 사용합니다. CW_USEDEFULT 를 지정하면 시스템이 임의로 위치와 크기를 지정합니다.

 

hWndParent : 부모 윈도우가 있을 경우 부모 윈도우의 핸들을 지정합니다. 없을 경우 NULL을 지정하며, 이 때 자신이 최상위 윈도우가 됩니다.

 

hMenu : 윈도우에서 사용할 메뉴의 핸들을 지정합니다. 자식 윈도우를 만들 때는 자식 윈도우의 ID값을 지정하는 용도로 사용합니다.

 

hInstance : WinMain의 인수로 전달된 응용 프로그램의 instance handle을 지정합니다. XP 이후부터는 이 값을 무시됩니다.

 

IpParam : 생성 인자를 전달할 목적으로 사용됩니다. 부모 윈도우 생성시는 주로 NULL을 사용합니다.

 

윈도우 화면에 출력하기

CreateWindow 함수로 만든 윈도우는 아직 화면에 보이지 않습니다. 아래의 함수는 생성된 윈도우를 화면에 보여주게 합니다.

ShowWindow( _In_ HWND hWnd, _In_ int nCmdShow);

첫번째 인자는 화면에 보여 줄 윈도우의 핸들입니다. 두번째 인자는 출력하는 방법을 지정하며 다음과 같은 매크로 상수들이 정의되어 있습니다.

 

매크로 상수 의미
SW_HIDE 윈도우를 숨긴다.
SW_MINIMIZE 윈도우를 최소화하고 활성화시키지 않는다.
SW_RESTORE 윈도우를 활성화시킨다.
SW_SHOW 윈도우를 활성화하여 보여준다.
SW_SHOWNORMAL 윈도우를 활성화하여 보여준다.

ShowWindow 를 호출 한 후 보통 아래 함수를 호출합니다. 아래 함수는 윈도우가 보여지고 난 후 최초에 발생하는 WM_PAINT 메시지를 즉시 처리하기 위해 사용합니다.

UpdateWindow(_In_ HWND hWnd);

 

윈도우 생성 코드

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

#define MAX_LOADSTRING 100
TCHAR szTitle[MAX_LOADSTRING] = _TEXT("First Sample"); // 제목 표시줄
TCHAR szWindowClass[MAX_LOADSTRING] = _TEXT("BIT"); // 기본 창 클래스


// 함수: MyRegisterClass()
// 목적: 윈도우 클래스 생성 및 등록
ATOM MyRegisterClass(HINSTANCE hInstance)
{
     WNDCLASSEX wcex;
     wcex.cbSize = sizeof(WNDCLASSEX);
     wcex.style = CS_HREDRAW | CS_VREDRAW;
     wcex.lpfnWndProc = DefWindowProc;
     wcex.cbClsExtra = 0;
     wcex.cbWndExtra = 0;
     wcex.hInstance = hInstance;
     wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
     wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
     wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
     wcex.lpszMenuName = 0;
     wcex.lpszClassName = szWindowClass;
     wcex.hIconSm = 0;
     return RegisterClassEx(&wcex);
}

// 함수: InitInstance(HINSTANCE, int)
// 목적: 윈도우 창을 만들고 핸들을 리턴
HWND InitInstance(HINSTANCE hInstance, int nCmdShow)
{
     HWND hWnd;
     hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
     CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
     if (!hWnd)
     {
          return 0;
     }
     
     ShowWindow(hWnd, nCmdShow);
     UpdateWindow(hWnd);
     return hWnd;
}

int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR lpCmdLine, int nShowCmd)
{
           //1,2 윈도우 클래스 생성 및 등록
           MyRegisterClass(hInst);
           //3,4 윈도우 생성 및 화면 출력
           HWND hwnd = InitInstance (hInst, nShowCmd);
           if (hwnd == 0)
           {
              return FALSE;
           }
           
           MessageBox(0, TEXT("Hello,API"),TEXT("First"), MB_OK);
           return 0;
}
728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기