본문 바로가기
프로그래밍/API

API-WNDCLASSEX

by 리뷰하는 (게임)프로그래머_리프TV 2010. 4. 24.


기존의 Win16에서 Win32로 API가 업그레이드 되면서,

WNDCLASS에 멤버를 추가한 WNDCLASSEX 구조체를 대신 사용 할 수 있다.

특별히 추가된건 많이 없어 보이는데,

간단하게 살펴보자.

#include <windows.h>

LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM );
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("WndClsEx");

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

	WndClassEx.cbClsExtra = 0;
	WndClassEx.cbWndExtra = 0;
	WndClassEx.hbrBackground = (HBRUSH)GetStockObject( COLOR_WINDOW+1 );
	WndClassEx.hCursor = LoadCursor( NULL, IDC_ARROW );
	WndClassEx.hIcon = LoadIcon( NULL, IDI_APPLICATION );
	WndClassEx.hInstance = hInstance;
	WndClassEx.lpfnWndProc = WndProc;
	WndClassEx.lpszClassName = lpszClass;
	WndClassEx.lpszMenuName = NULL;
	WndClassEx.style = CS_HREDRAW | CS_VREDRAW;
	// 추가된 멤버 
	WndClassEx.hIconSm = NULL;		// 작은 아이콘이 따로 추가가 가능하다.
	WndClassEx.cbSize = sizeof( WNDCLASSEX );	// 구조체의 sizeof를 보내주면된다.

	// 기존의 레지스터 대신 뒤에 EX를 붙힌다.
	if( RegisterClassEx( &WndClassEx ) == 0 )
	{
		MessageBox( NULL, TEXT("윈도우 클래스 등록 실패"), TEXT("에러"), MB_OK );
		return -1;
	}

	// 기존의 생성 뒤에 EX를 붙히고, 첫번째 인자가 추가되었다.
	hWnd = CreateWindowEx(WS_EX_APPWINDOW, lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, (HMENU)NULL, hInstance, NULL );
	ShowWindow( hWnd, nCmdShow );

	while( GetMessage( &Message, NULL, 0, 0 ) )
	{
		TranslateMessage( &Message );
		DispatchMessage( &Message );
	}
	return (int)Message.wParam;
}

LRESULT CALLBACK WndProc( HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam )
{
	HDC hdc;
	PAINTSTRUCT ps;

	switch( iMessage )
	{
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint( hWnd, &ps );
		EndPaint( hWnd, &ps );
		return 0;
	}
	return( DefWindowProc( hWnd, iMessage, wParam, lParam));
}​


몇몇 바뀐게 있긴 하지만 기존의 창 생성과 큰 차이는 없어 보인다.
혹시라도 윈도우 생성에 실패하면 확인해 주기 위해 if문 수식이 추가 되었지만, 그건 신경쓰지 말고,
멤버는 2개가 추가 되었는데,
WNDCLASSEX를 사용하게되면, cbsize에 WNDCLASSEX를 sizeof로 보내주어야 한다.
그리고 CreateWindowEx에 첫번째 인자는 확장 스타일에 관한 것이다.
스타일이 꽤 많아서 도표로 만들진 않겠지만, 이중 경계선을 가진다던지, 비활성화중에도 가장 상위에 보여진다거나, 타이틀바를 오른쪽으로 정렬한다거나 하는 등, 괜찮아 보이는 스타일들이 확장되었다.

'프로그래밍 > API' 카테고리의 다른 글

API-ChildWnd  (0) 2010.04.24
API-WindowLong  (0) 2010.04.24
API-대화상자  (0) 2010.04.24
API-Control(2)  (0) 2010.04.24
API-Control(1)  (0) 2010.04.24