반응형
먼저 윈도우 클래스를 통해 윈도우 창에 특성을 정의한 후, 이전에 사용했던 CreateWindow를 통해서 윈도우를 생성해야 합니다.
그럼 WNDCLASS (윈도우 클래스)에 대해서 먼저 마소에 물어보겠습니다.(발번역 시작)
typedef struct tagWNDCLASS { UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; } WNDCLASS, *PWNDCLASS; |
매개 변수 | 의미 |
style | 윈도우의 스타일을 지정합니다. (자세한 윈도우 스타일은 링크를 참조해주세요.) |
lpfnWndProc | 윈도우의 메세지 처리 함수를 지정합니다. (가장 기본적으로 WndProc 을 지정합니다.) |
cbClsExtra | 여분의 바이트를 윈도우 클래스 구조 다음으로 할당합니다. 해당 시스템은 0으로 초기화 할 수 있습니다.(0으로 사용하지 않음) |
cbWndExtra | 여분의 바이트를 윈도우 인스턴스 다음으로 할당합니다. 해당 시스템은 0으로 초기화 할 수 있습니다.(0으로 사용하지 않음) |
hInstance | 클래스의 윈도우 프로시저를 포함하는 인스턴스에 대한 핸들값입니다. (WinMain의 인수로 전달된 hInstance값을 그대로 사용해주면 됩니다.) |
hIcon | 윈도우가 최소화 되었을때 표시되는 아이콘입니다. 해당 값이 NULL 일 경우 윈도우에서 제공하는 시스템 디폴드 아이콘을 사용합니다. |
hCursor | 윈도우가 최소화 되었을때 표시되는 커서입니다. 해당 값이 NULL 일 경우 윈도우에서 제공하는 시스템 디폴드 커서를 사용합니다. |
hbrBackground | 윈도우의 배경색을 지정할 수 있습니다. (GetStockObject를 통해 색상을 지정할 수 있습니다.) |
lpszMenuName | 사용할 메뉴를 지정합니다. 메뉴를 사용하지 않을려면 NULL을 설정할 수 있습니다. |
lpszClassName | 윈도우의 클래스 이름을 정의합니다. NULL로 끝나거나 포인터로 이루어진 값을 사용할 수 있습니다. 최대 크기는 256이상이 될 수 없습니다. (여기서 지정한 이름은 CreateWindow 함수에 전달됩니다. ) |
기타 | 모두 반드시 외우기 보다 필요한 부분만 익히면 되겠습니다.. |
클래스를 등록했으면 RegisterClass 함수를 통해 윈도우를 등록해야 합니다.
ATOM WINAPI RegisterClass( _In_ const WNDCLASS *lpWndClass ); |
매개 변수 | 의미 |
lpWndClass | WNDCLASS 구조에 대한 포인터를 입력합니다. (정의된 클래스 명 입력) |
또한 ShowWindow 함수를 통해 윈도우 창을 출력해주어야 합니다.
BOOL WINAPI ShowWindow( _In_ HWND hWnd, _In_ int nCmdShow ); |
매개 변수 | 의미 |
hWnd | 화면에 출력하고자하는 윈도우의 핸들값을 입력합니다. |
nCmdShow | 윈도우가 표시되는 방법을 제어합니다. 처음 ShowWindow 함수가 호출되면 nCmdShow에서 WinMain 기능에 의해 얻어진 값으로 사용합니다. |
이제 메세지 루프를 실행해서 윈도우가 지속적으로 실행되도록 해야 하고 메시지 처리 함수를
만들어야 합니다.
일단 해당하는 부분은 나중에 설명하도록 하고 먼저 위 사항이 모두 갖추어졌을 때를 코드로 구현해서
출력해 보겠습니다.
#include <Windows.h>
HINSTANCE _hInstance;
HWND hWnd;
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int cmdShow)
{
WNDCLASS WndClass;
MSG mag;
_hInstance = 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)WindowProc;
WndClass.lpszClassName = "Hello word";
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd = CreateWindowA(
"Hello word" ,
"Hello Wold Window" ,
WS_OVERLAPPEDWINDOW,
10 ,
10 ,
1000 ,
1000,
NULL,
(HMENU)NULL ,
hInstance ,
NULL
);
ShowWindow(hWnd ,cmdShow);
while ( GetMessage( &mag , 0 , NULL , NULL ) )
{
DispatchMessage(&mag);
}
return mag.wParam;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
switch(uMsg)
{
case WM_PAINT:
{
hdc = BeginPaint(hWnd, &ps);
TextOut(hdc, 100, 100, "Hellow Wordl!", 13);
EndPaint(hWnd , &ps);
break;
}
case WM_DESTROY:
{
PostQuitMessage(0);
break;
}
}
return DefWindowProc( hwnd , uMsg , wParam , lParam );
}
//출력 결과 |
반응형
'프로그래밍 관련 > Win API' 카테고리의 다른 글
WIndows API - #4. 윈도우창 출력 함수 자세히보기(2) (0) | 2015.08.23 |
---|---|
WIndows API - #4. 윈도우창 출력 함수 자세히보기(1) (0) | 2015.08.23 |
WIndows API - #3. 윈도우창에 Hello World 출력하기(1) (4) | 2015.08.21 |
WIndows API - #2. Hello World MessageBox 출력하기(2) (0) | 2015.08.21 |
WIndows API - #2. Hello World MessageBox 출력하기(1) (0) | 2015.08.20 |