[Vision] Window Manager Class - 윈도우 관리 클래스
Posted on 2008/05/25 22:10
Filed Under Complete project
1. 요 약#
View Manager 를 관리하는 클래스로 모든 ChildWindow 를 총체적으로 관리하는 클래스입니다.
2. 구 현#
2.1 Header#
[code]#pragma once#include "../ViewManager/ViewManager.h"
#include <list>
#include <algorithm>
using namespace std;
class CWndManager
{
public:
CWndManager();
CViewManager* AddWindow(CFrameWnd*); //차일드프레임포인터로 새로운 뷰매니저를 추가
CViewManager* FindViewManager(CFrameWnd* Object); //차일드 프레임 포인터로 등록된 뷰메니저 검색
CFrameWnd* FindChildFrameFromViewType(int ViewType); //뷰타입으로 등록된 차일드 프레임 검색
int DeleteWindow(CViewManager*); //윈도우의 삭제
void RenameWindow(CViewManager*,LPCTSTR); //윈도우의 이름 변경
public:
list<CViewManager*> ViewList; //STL 리스트로 뷰매니저의 리스트를 생성
list<CViewManager*>::iterator itor; //리스트뷰의 반복자 설정
};
[/code]
Window Manager 클래스의 헤더입니다. ViewManager 을 다루기 때문에 ViewManager 클래스 헤더를 포함하고 있습니다.
그리고 관리하는 자료구조로 STL 의 list 를 사용하고 있습니다.
2.2 CWndManager#
[code]CWndManager::CWndManager(){
itor=ViewList.begin(); //반복자를 시작을 가리키도록 한다.
}[/code]
생성자에서는 단순히 반복자를 List 시작을 가르키도록 설정합니다.
2.3 AddWindow#
[code]CViewManager* CWndManager::AddWindow(CFrameWnd* ChildObject){
if(FALSE == FindViewManager(ChildObject)){
CViewManager* Object = new CViewManager; //뷰매니저 오브젝트 설정
Object->Init(ChildObject); //뷰매니저를 초기화
ViewList.push_back(Object); //뷰매니저를 리스트에 삽입
return Object; //뷰매니저를 리턴
}
return FALSE;
}
[/code]
AddWindow 는 생성한 ChildWindow 에 대한 ViewManager 를 생성하고 리스트에 추가하는 작업을 합니다.
2.4 FindViewManager#
[code]CViewManager* CWndManager::FindViewManager(CFrameWnd* Object){
for(itor=ViewList.begin(); itor != ViewList.end(); itor++ )
{
CViewManager* mView = *itor;
if(mView->IDentity == Object)
return mView;
}
return FALSE;
}[/code]
FinaViewManager는 ChildFrame 포인터로 해당 ChildWindow를 관리하는 ViewManager 을 검색하여 돌려줍니다.
2.5 FindChildFromViewType#
[code]CFrameWnd* CWndManager::FindChildFrameFromViewType(int ViewType){
for(itor=ViewList.begin(); itor != ViewList.end(); itor++ )
{
CViewManager* mView = *itor;
if(mView->IDentity->VIEWTYPE == ViewType)
return mView->IDentity;
}
return NULL;
}[/code]
FindChildFromVieweType은 VIEWTYPE 을 이용하여 해당 ChildFrame 포인터를 검색하여 돌려줍니다.
일반적으로 FindViewManager 은 ChildFrame 포인터를 직접 알 수 있는 곳에서 바로 사용할 수 있고, 그게 아니라면 먼저 FindChildFromViewType 으로 원하는 윈도우의 식별자를 직접 검색하여 돌려받은 ChildFrame 포인터로 FindViewManager 을 이용하여 ViewManager 을 찾아내는 2-Phase 검색입니다.
2.6 DeleteWindow#
[code]int CWndManager::DeleteWindow(CViewManager* Target){
if(Target==NULL){
AfxMessageBox(_T("타겟이 없거나 찾기에 실패했습니다"));
return NULL;
}
itor=find(ViewList.begin(), ViewList.end(),Target); //삭제할 대상의 뷰포인터를 리스트에서 찾는다
if(*itor==NULL)
return NULL;
CViewManager* Object = *itor; //리스트에서 뷰매니저를 가져온다
int VIEWTYPE = Object->IDentity->VIEWTYPE;
if(VIEWTYPE != VT_MAINWINDOW){ //카메라타입이 아닐경우
Object->IDentity->DestroyWindow();
Object->ReleaseView();
ViewList.erase(itor); //뷰메니저를 삭제한다.
return VIEWTYPE; //삭제된 윈도우의 뷰타입을 리턴
}
else { //카메라타입일 경우
for(itor=ViewList.begin(); itor != ViewList.end(); ) { //모든 등록창을 삭제한다
CViewManager* Object = *itor;
Object->IDentity->DestroyWindow();
Object->ReleaseView();
ViewList.erase(itor++);
}
return VIEWTYPE;
}
return NULL;
}
[/code]
DeleteWindow 는 윈도우를 삭제하고 실제 표시되는 윈도우를 닫는 작업을 합니다.
프로젝트에 의존적인 코드들이 다수 있습니다.
3. 문제점#
다른 곳에도 다 그렇듯이 라이브러리쪽에 프로젝트에 의존적인 있는 코드를 다수 집어 넣어서 의존성 문제가 발생합니다.
물론 현재 진행중인 프로젝트의 동작과 관련된 부분이라 쉽게 바꿀 수 있는 부분이지만 이런 설계는 처음이라 그런지 여러모로 고민이 많이 되었습니다.
팀원들의 MFC 사용에 대한 부담을 최대한 줄일려고 한 점은 어느정도 성공적이지만 역시나 보기 좋지 않은 코드들이 수두룩 하군요.
언젠가 비슷한 프로젝트를 진행할 때 이게 무엇인고 하면서 제가 만든 코드에 제가 머리를 쥐어 뜯는 사태가 발생할 지도 모르겠습니다.
'Complete project' 카테고리의 다른 글
| [Vision] Window Manager Class - 윈도우 관리 클래스 (0) | 2008/05/25 |
|---|---|
| [Vision] View Manager Class - 뷰 관리자 클래스 (0) | 2008/05/25 |
| [Vision] MFC Architect - MFC 구조 (0) | 2008/05/25 |
| [Vision] Camera management class - 카메라 관리 클래스 (0) | 2008/04/08 |
| [Vision] Display management class - 화면 출력 관리 클래스 (0) | 2008/04/08 |
| [Vision] Log management class - 로그 관리 클래스 (0) | 2008/03/28 |




댓글을 달아 주세요