본문 바로가기

카테고리 없음

5. CWnd 클래스

최호성님의 VISUAL C++ 2008 MFC 윈도우 프로그래밍을 학습한 뒤 정리한 내용입니다.


CWnd 클래스는 모든 MFC 클래스의 부모인 CObject 클래스와 CCmdTarget 클래스를 상속받은 클래스 입니다. CCmdTarget 클래스는 MFC의 메시지 맵과 관련된 코드가 구현된 클래스 입니다. 메시지 맵은 윈도우 프로시저 함수의 switch문을 대체하는 MFC 구조입니다.


CWnd 클래스는 윈도우 자체를 객체화한 클래스입니다.


CWnd 클래스 초기화 메서드

- Create()/CreateEx() 윈도우 생성함수, CreateEx()는 추가로 확장 속성 지정가능

- PreCreateWindow() 윈도우 생성 직전 호출되는 가상 함수, 재정의하여 생성되는 윈도우의 속성을 변경하는 코드를 추가할 수 있음

- GetStyle()/GetExStyle() 윈도우의 기본 스타일과 확장 스타일을 반환하는 함수

- PreSubclassWindow() 서브 클래싱 직전에 호출되는 가상 함수

- GetSafeHwnd() 생성된 윈도우의 핸들을 반환하는 함수


기본적인 CWnd 클래스 테스팅을 위해 MFC 템플릿을 이용한 단일 문서 프로젝트를 생성합니다. 생성 후에는 *View 헤더에 CWnd 클래스 객체를 멤버로 추가합니다. 그 후 클래스 속성에서 메시지 버튼을 선택하여 WM_CREATE 메시지를 선택한 후 OnCreate를 메시지 핸들러 함수로 등록하면 *View.cpp파일에 OnCreate() 함수가 추가됩니다. WM_CREATE는 이름만 봐서도 알겠지만 메시지 중에서 윈도우 프로그램이 시작되어 윈도우가 생성될 때 발생하는 메시지입니다. OnCreate()는 그러므로 처음 윈도우 생성시에 어떠한 동작을 할지 정의해주는 메서드라 할 수 있습니다.


OnCreate() 함수의 기본형은 아래와 같습니다.


int (project_name)View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;

	return 0;
}


Wnd 클래스 객체를 이용하여 윈도우를 생성하기 위해서는 Create() 함수를 이용합니다. Create() 함수는 아래와 같은 형태를 띄고 있습니다.


	// for child windows, views, panes etc
	virtual BOOL Create(LPCTSTR lpszClassName,
		LPCTSTR lpszWindowName, DWORD dwStyle,
		const RECT& rect,
		CWnd* pParentWnd, UINT nID,
		CCreateContext* pContext = NULL);


Create() 함수의 인자

- lpszClassName 윈도우 클래스 이름에 해당하는 문자열

- lpszWindowName 호면에 출력할 윈도우 텍스트에 해당하는 문자열

- dwStyle 윈도우 스타일을 명시하는 파라미터, |로 조합하여 사용가능

- rect RECT 구조체에 대한 참조, 좌상위와 우하위의 좌표를 인자로 받음

typedef struct tagRECT
{
    LONG    left;
    LONG    top;
    LONG    right;
    LONG    bottom;
} RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

- pParentWnd 부모 윈도우의 포인터

- nID 윈도우 내부의 자식 윈도우를 식별하는 값

- pContext 생성할 윈도우의 컨텍스트를 명시하는 구조체의 포인터