// Modal 대화상자
TCreateMapDlg mapDlg;
INT ret = mapDlg.DoModal(); // Modal한 대화상자 show
// Modalless 대화상자
if (m_MapDlg.GetSafeHwnd() == NULL) // 대화상자가 생성됐는지 검사
{
m_MapDlg.Create(IDD_CREATE_MAP_DLG); // 대화상자 생성
}
m_MapDlg.ShowWindow(SW_SHOW); // Modalless한 대화상자 show
이미 정의되어있는 Dialog
CFileDialog FileDlg(FALSE, // TRUE:열기, FALSE:저장
L"bmp", // 이름
NULL,
OFN_HIDEREADONLY | OFN_NOCHANGEDIR,
L"bmp Files(*.bmp)|*.bmp|All Files(*.*)|*.*|", this); // 파일형식 정의 : 이름|타입
CString selectFileName;
if (FileDlg.DoModal() == IDOK) // 저장, 취소를 누르기 전까지 Blocking
{
selectFileName = FileDlg.GetPathName();
selectFileName += FileDlg.GetFileName();
AfxMessageBox(selectFileName);
}
CColorDialog ColorDlg(RGB(255, 0, 0), CC_FULLOPEN); // CC_FULLOPEN 미설정 시 아래 이미지의 왼쪽만 생성
CString selectFileName;
if (ColorDlg.DoModal() == IDOK)
{
COLORREF color = ColorDlg.GetColor();
selectFileName.Format(L"%u, %u, %u", GetRValue(color),
GetGValue(color),
GetBValue(color));
AfxMessageBox(selectFileName);
}
CFontDialog FontDlg;
CString selectFileName;
if (FontDlg.DoModal() == IDOK)
{
COLORREF color = FontDlg.GetColor();
selectFileName.Format(L"%s, %d, %u, %u, %u",
FontDlg.GetFaceName(),
FontDlg.GetSize(),
GetRValue(color),
GetGValue(color),
GetBValue(color));
AfxMessageBox(selectFileName);
}
이동 가능하고 원하는 위치에 붙일 수 있는 창
속성의 스타일을 child으로 설정해야 함
클래스 마법사를 이용해 MFC Class의 CDockablePane, CFormView 생성
int TPaneWindowUI::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
// DockablePane에 FormView를 붙인다
m_wndForm = TUIDlg::CreateFormView(this);
return 0;
}
void TPaneWindowUI::OnSize(UINT nType, int cx, int cy)
{
CDockablePane::OnSize(nType, cx, cy);
// DockablePane의 화면 크기가 변경될 때 refresh 작업
if (m_wndForm)
{
m_wndForm->SetWindowPos(NULL, 0, 0, cx, cy, SWP_NOZORDER);
}
}
int TPaneWindowUI::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message)
{
CFrameWnd* pParentFrame = GetParentFrame();
if (pParentFrame == pDesktopWnd ||
pDesktopWnd->IsChild(pParentFrame))
{
return CDockablePane::OnMouseActivate(pDesktopWnd, nHitTest, message);
}
return MA_NOACTIVATE;
}
DockablePane이 BaseWindow에 붙어있을때 특별히 event가 지정되지 않은 지점을 클릭해도 자신의 event를 부모에게 전달해도 문제가 없지만 BaseWindow와 분리되어 유동적인 상황에서 event가 지정되지 않은 지점을 클릭한다면 부모가 존재하지 않으므로 에러 발생
이를 막기 위해 MA_NOACTIVATE 반환
DWORD dwStyle = WS_CHILD | WS_VISIBLE |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
CBRS_LEFT | CBRS_FLOAT_MULTI;
DWORD dwID = 0;
m_TabbedPane.CreateEx(NULL, L"TAB", this,
CRect(0, 0, 300, 300),
TRUE,
dwID, dwStyle);
m_TabbedPane.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_TabbedPane);
m_PaneMap.CreateEx(NULL, L"지형컨트럴", this,
CRect(0,0,300,300),
TRUE,
dwID, dwStyle);
m_PaneMap.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_PaneMap);
m_PaneUI.CreateEx(NULL, L"인터페이스", this,
CRect(0, 0, 300, 300),
TRUE,
5554, dwStyle);
m_PaneUI.EnableDocking(CBRS_ALIGN_ANY);
DockPane(&m_PaneUI);
m_TabbedPane.AddTab(&m_PaneMap);
m_TabbedPane.AddTab(&m_PaneUI);