728x90
반응형
MDI에서 ChildFrame을 관리하는 것은 생각보다 번거로운 일이다. CMainFrame에서 CChildFrame을 찾고 해야 한다. MDI에서 새로운 창을 만들 때에 가끔 동일 창을 호출하는 경우가 있다. 그럴 경우에는 창을 새롭게 만들 것이 아니라 만들어진 창을 맨 앞으로 끄집어 와야 한다. 보통 CChildFrame을 컨트롤할 때는 아래와 같이 한다.
// CMainFrame 에서 라면,
CWnd* pWnd = FindWindow(NULL, /*ChildWnd Name*/);
pWnd->BringWindowToTop(); // 해당 창을 맨 앞으로 가져온다.
하지만 Caption의 이름이 바뀔 수도 있고, 관리하기도 쉽지 않다.
그래서 CMainFrame에 CChildFrame을 관리할 수 있는 변수를 추가하자.
#include <map>
#include <string>
using namespace std;
...
map<wstring, CMDIChildWnd*> m_mapChildFrm; // 이름과 핸들을 저장하는 map 변수
...
그리고 새 창을 만들 때 아래와 같이 구현한다.
void CMainFrame::OnCreateFrame(wstring frameName)
{
// 해당 이름이 생성되어 있는지 확인한다.
map<wstring, CMDIChildWnd*>::iterator iter;
iter = m_mapChildFrm.find(frameName);
// 이미 만들어진 창이라면 맨 앞으로 가져온다.
if (m_mapChildFrm.size() && iter != m_mapChildFrm.end())
{
CChildFrame* pWnd = (CChildFrame*)iter->second;
pWnd->BringWindowToTop(); //
return;
}
// 새창 열기
CDocTemplate* pTemplateDoc = theApp.m_pDocTemplate;
pTemplateDoc->OpenDocumentFile(NULL);
CChildFrame* pWnd = (CChildFrame*)MDIGetActive();
CDBAppListView* pView = (CDBAppListView *)pWnd->GetActiveView();
// 핸들과 이름을 저장한다.
pWnd->m_sFrameName = frameName; // 자식창의 이름을 전달한다.
m_mapChildFrm.insert(pair<wstring, CMDIChildWnd*>(frameName, pWnd));
}
대신 창을 닫을 때 해당 변수를 제거해야 한다. 제거하는 함수를 만들어 두고 CChildFrame이 OnClose될 때 호출하자.
void CMainFrame::CloseMDIChildWnd(wstring tblname)
{
map<wstring, CMDIChildWnd*>::iterator iter;
iter = m_mapChildFrm.find(tblname);
if (m_mapChildFrm.size() && iter != m_mapChildFrm.end())
{
m_mapChildFrm.erase(tblname);
}
}
void CChildFrame::OnClose()
{
CMainFrame* pFrame = (CMainFrame *)AfxGetMainWnd();
pFrame->CloseMDIChildWnd(m_sFrameName);
CMDIChildWnd::OnClose();
}
728x90
반응형
'Program Language > API | MFC' 카테고리의 다른 글
[MFC] SendMessage로 문자 보내기 (0) | 2021.05.24 |
---|---|
[MFC] MDI 자식창 모두 닫기 (0) | 2021.05.21 |
[MFC] MDI에서 시작 시 새 창 방지 코드 (0) | 2021.05.20 |
[MFC] MDI에서 새창 열기 (0) | 2021.05.20 |
[MFC] 다이얼로그 캡션 변경 (0) | 2021.05.20 |