02.07

신승빈·2023년 2월 7일
0

KGCA 수업

목록 보기
104/128

MFC

	// 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

CFileDialog, CColorDialog, CFontDialog

이미 정의되어있는 Dialog

CFileDialog

	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

	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

	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);
	}

CDockablePane


이동 가능하고 원하는 위치에 붙일 수 있는 창


속성의 스타일을 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::OnMouseActivate()


DockablePane이 BaseWindow에 붙어있을때 특별히 event가 지정되지 않은 지점을 클릭해도 자신의 event를 부모에게 전달해도 문제가 없지만 BaseWindow와 분리되어 유동적인 상황에서 event가 지정되지 않은 지점을 클릭한다면 부모가 존재하지 않으므로 에러 발생
이를 막기 위해 MA_NOACTIVATE 반환

CTabbedPane

	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);

Docker 생성

	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);

TabbedPane에 Docker 붙이기

	m_TabbedPane.AddTab(&m_PaneMap);
	m_TabbedPane.AddTab(&m_PaneUI);
profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글