실용적이고 효과적인 프로그래밍을 하기 위해서는 때로 대화상자기반의 윈도우에서 사용자가 원하는 형태의 윈도우를 자식윈도우로 생성하고 싶은 경우가 생길 수 있습니다.
WIN32API에서 다이얼로그기반의 윈도우에서 일반윈도우를 생성하기 위해서 생성할 일반윈도우의 Init부분에서 WNDCLASS라는 구조체를 사용해서 윈도우 클래스를 만들고 RegisterClass()라는 함수를 사용해서 윈도우 클래스를 등록해준 후에 ShowWindow()메서드를 호출해주었습니다. 하지만 MFC에서는 윈도우 클래스 등록을 보다 편리하게 하기 위해서 AfxRegisterWndClass()라는 편리한 함수를 제공하고 있습니다. 함수 시그니쳐는 다음과 같습니다.
LPCTSTR AFXAPI AfxRegisterWndClass( UINT nClassStyle,
HCURSOR hCursor = 0,
HBRUSH hbrBackground = 0,
HICON hIcon = 0 );
1번째 인자로는 윈도우 클래스의 스타일을 2번째 인자는 윈도우에서 사용할 커서, 3번째 인자로는 윈도우의 배경색, 4번째 인자로는 윈도우 title바에서 사용할 Icon을 지정하면 됩니다.
AfxRegisterWndClass() 함수는 인자로 전달된 4개의 인자를 사용해서 윈도우 클래스를 등록 한후 등록된 윈도우 클래스의 이름을 리턴해 줍니다. 이후 윈도우를 생성할 때 리턴 된 윈도우 클래스 이름을 사용하면 됩니다.
예제로 확인해보겠습니다.
1. 먼저 대화상자기반의 MFC프로젝트를 생성합니다.
2. CWnd클래스에서 파생된 대화상자의 자식윈도우로 생성하고 싶은 일반윈도우 클래스를 생성합니다.
3. 대화상자클래스의 OnInitDialog()메서드 내부에 다음과 같은 코드를 작성합니다.
("MyChild.h"파일을 include하고 해당 객체의 포인터변수를 가지고 있어야합니다.)
CString classname = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW,
LoadCursor(0,IDC_ARROW),
(HBRUSH)::GetStockObject(WHITE_BRUSH),
LoadIcon(0,IDI_APPLICATION));
mc = new MyChild();
mc->Create(classname,L"",WS_CHILD | WS_VISIBLE | WS_BORDER,CRect( 10, 10, 100 ,100 ), this,100);
mc->ShowWindow(SW_SHOW);
(Win32Api에서 WNDCLASS구조체를 선언하고 구조체 멤버변수를 일일이 변경해준 후에 RegisterClass()메서드를 호출했던점에 비해 MFC에서는 AfxRegisterWndClass()메서드로 원하는 윈도우를 등록하고 return 받은 클래스이름으로 Create()메서드의 첫번째매개변수에 넣어주면 간단히 원하는 윈도우를 추가할수 있습니다.
위 그림과 같이 대화상자기반의 윈도우의 내부에 원하는 스타일의 윈도우를 자식윈도우로 생성할 수 있습니다.
* 예제 *