Modal 생성법
CModalDlg Dlg;
INT_PTR nResult = Dlg.DoModal();
if(nResult == IDOK)
AfxMessageBox(_T("OK를 눌렀음"));
Modeless 생성법
static CModelessDlg Dlg;
if(Dlg.GetSafeHwnd() == NULL)
Dlg.Create(IDD_Dialog_Modaless);
Dlg.ShowWindow(SW_SHOW);
공용대화상자
공용 대화 상자는 사용자 인터페이스의 일관성을 유지하도록 시스템이 정의한 대화상자로서, 특별한 경우가 아니라면 별도의 기능 확장없이 사용가능하며, 운영체제에 따라 자동으로 외형이 달라진다. 다음은 대표적인 공용 대화 상자이다,
CFileDialog 파일 대화상자
CFontDialog 글꼴 대화상자
CColorDialog 색 대화상자
CPageSetupDialog 페이지 설정 대화상자
CPrintDialog 인쇄 대화상자
CFindReplaceDialog 찾기/바꾸기 대화상자
COleDialog OLE 대화상자
다음은 파일 대화 상자 예제다.
void CCommonDlgDlg::OnBnClickedButtonFile()
{
CString strTmp = _T("");
//맨마지막에 ||을 두번넣어서 끝임을 명시한다. 첫번째는 보이는 문자열, 두번째는 확장자명. 한세트씩 만들어야 한다.
// TRUE 일 경우, 파일 열기모드, FALSE이면 파일 저장모드.
CFileDialog Dlg(TRUE, _T("exe"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST,
_T("EXE Files(*.exe) | *.exe | All Files(*.*) | *.* ||"), this);
if(Dlg.DoModal() == IDOK)
{
strTmp.Format(_T("Full Path : %s, FileName : %s, Extension : %s "), Dlg.GetPathName(), Dlg.GetFileName(), Dlg.GetFileExt());
AfxMessageBox(strTmp);
}
}
다음은 글꼴 대화 상자의 예제다.
void CCommonDlgDlg::OnBnClickedButtonFont()
{
CClientDC dc(this);
CString strTmp = _T("");
LOGFONT lf;
::ZeroMemory(&lf, sizeof(lf));
// MulDiv 함수는 32비트 간의 곱셈 연산 결과를 64비트 버퍼에 저장한 다음 다시 32비트로 나눈다.
// 즉 ( 9 * pDC->GetDeviceCaps(LOGPIXELSY)) / 72 와 같으며, 여기서 72는 MM_TEXT 매핑모드에서 1인치당 표시 가능한 픽셀수다.
// 공식이라고 할 수 있으니 외워도 좋다.
lf.lfHeight = MulDiv(15, dc.GetDeviceCaps(LOGPIXELSY), 72);
wsprintf(lf.lfFaceName, _T("%s"), _T("굴림"));
CFontDialog Dlg(&lf); //폰트다이얼로그에 LogFont 구조체를 넘긴다.
if( Dlg.DoModal()==IDOK)
{
strTmp.Format(_T("Font : %s Size: %s "), Dlg.GetFaceName(), Dlg.GetSize());
AfxMessageBox(strTmp);
}
}
다음은 색 대화 상자를 활용하는 예제다.
void CCommonDlgDlg::OnBnClickedButtonColor()
{
CString strTmp=_T("");
CColorDialog Dlg(RGB(0,0,0), CC_FULLOPEN); //검은색으로 기본값을 생성, 사용자 정의 색 만들기 버튼도 만듬.
if(Dlg.DoModal()==IDOK)
{
COLORREF color = Dlg.GetColor(); //선택한 컬라값(RGB)을 가져옴
strTmp.Format(_T("RGB : %u %u %u"), GetRValue(color), GetGValue(color), GetBValue(color));
AfxMessageBox(strTmp);
}
}
다음은 폴더 찾아보기 대화 상자를 활용하는 예제다.
void CCommonDlgDlg::OnBnClickedButtonFolder()
{
BROWSEINFO bi;
TCHAR szBuffer[MAX_PATH]; //260, 파일주소가 들어갈 곳
::ZeroMemory(&bi, sizeof(bi));
::ZeroMemory(szBuffer, MAX_PATH);
bi.hwndOwner = m_hWnd; //다이얼로그를 부모로 삼는다.
bi.lpszTitle =_T("파일이 저장된 폴더를 선택해 주세요"); //타이틀명
// 1, 새로운 공용 컨트롤 버전이 제공하는 새로운 스타일을 사용한다,
// 2, 폴더 이름편집, 에디트컨트롤 가능,
// 3, 제어판가튼거 안보이고, 실제 폴더 정보만 보이게한다.
bi.ulFlags = BIF_NEWDIALOGSTYLE | BIF_EDITBOX | BIF_RETURNONLYFSDIRS;
// bi.pidlRoot = NULL; 기본값은 NULL이며 바탕화면이 루트 폴더가 된다.
// pidIRoot 멤버는 대화상자에 출력할 폴더 트리 중 루트 폴더의 PIDL(Pointer Item Identifier List) 가 들어간다
LPITEMIDLIST pItemIdList = ::SHBrowseForFolder(&bi); // 선택한 폴더의 PIDL 을 반환한다.
// 그러나 이 값만으로는 구체적인 폴더의 경로를 알수가 없으므로
// ::SHGetPathFromIDList() 함수를 이용하여 PIDL 에 대한 상세 경로를 알아낸다.
// 즉 ::SHBrowseForFolder() 함수와 ::SHGetPathFromIDList() 함수는 늘 함께 사용한다.
if(::SHGetPathFromIDList(pItemIdList, szBuffer))
{
AfxMessageBox(szBuffer);
}
}
'Windows > MFC' 카테고리의 다른 글
MDI 를 닮은 SDI (0) | 2011.11.19 |
---|---|
다중 뷰 - 동적 분할 윈도우와 정적 분할 윈도우 (0) | 2011.11.19 |
탭 컨트롤 (0) | 2011.11.18 |
드래그 앤 드롭 ( Drag-And-Drop) (0) | 2011.11.18 |
트리 컨트롤 ( CTreeCtrl ) (0) | 2011.11.18 |