태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

[Vision] Window Manager Class - 윈도우 관리 클래스

Posted on 2008.05.25 22:10
Filed Under 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 사용에 대한 부담을 최대한 줄일려고 한 점은 어느정도 성공적이지만 역시나 보기 좋지 않은 코드들이 수두룩 하군요.

언젠가 비슷한 프로젝트를 진행할 때 이게 무엇인고 하면서 제가 만든 코드에 제가 머리를 쥐어 뜯는 사태가 발생할 지도 모르겠습니다.

댓글을 달아 주세요

About



모바일 페이지 QR 코드

Counter

· Total
: 510,599
· Today
: 15
· Yesterday
: 10


DNS server, DNS service