mfc cfolderdialog에 편집 상자를 추가하려면 어떻게합니까 ( "폴더 찾아보기"대화 상자)?
-
06-07-2019 - |
문제
현재 CDOCManagerex 클래스에서 파일 작업을 처리하는 데 사용되는 CFolderDialog 클래스가 있습니다.
Alt Text http://img268.yfrog.com/img268/9271/filedialog.png
이 클래스의 메소드 구현을 보여줄 필요가 있는지 모르겠습니다 (게시 된 프로젝트에서 이것을 찾았습니다. 여기), 그러나 도움이되는 경우 클래스 정의는 다음과 같습니다.
class CFolderDialog
{
friend static int CALLBACK BrowseDirectoryCallback(
HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData);
public:
CFolderDialog( LPCTSTR lpszFolderName = NULL,
DWORD dwFlags = NULL/*BIF_RETURNONLYFSDIRS*/,
CWnd* pParentWnd = NULL);
virtual ~CFolderDialog();
virtual int DoModal();
CString GetPathName() const;
protected:
virtual void OnInitDialog();
virtual void OnSelChanged(ITEMIDLIST* pIdl);
virtual void CallbackFunction(HWND hWnd, UINT uMsg, LPARAM lParam);
void EnableOK(BOOL bEnable = TRUE);
void SetSelection(LPCTSTR pszSelection);
void SetSelection(ITEMIDLIST* pIdl);
void SetStatusText(LPCTSTR pszStatusText);
CString ShortName(const CString& strName);
public:
BROWSEINFO m_bi;
protected:
CString m_strInitialFolderName;
CString m_strFinalFolderName;
TCHAR m_szDisplayName[MAX_PATH];
TCHAR m_szPath[MAX_PATH];
HWND m_hDialogBox;
};
class CMyFolderDialog : public CFolderDialog
{
public:
CMyFolderDialog(LPCTSTR lpszFolderName = NULL,
DWORD dwFlags = NULL,
CWnd* pParentWnd = NULL,
LPCTSTR pszFileFilter = NULL);
virtual ~CMyFolderDialog();
protected:
virtual void OnSelChanged(ITEMIDLIST* pIdl);
protected:
CString m_strFileFilter;
};
이 질문의 목표는 디렉토리가 선택된 작업 공간 바로 아래 창에 편집 컨트롤을 추가하는 것입니다. 이것을 달성하는 가장 쉬운 방법은 무엇입니까?
해결책
사용자가 디렉토리 항목의 이름을 입력 할 수있는 편집 컨트롤 만 원한다면 가능합니다. 사용중인 C ++ 클래스는 Win32 Shbrowseforfolder () 메소드 라운드 래퍼이며 해당 메소드는 BrowseInfo 구조의 Ulflags 멤버에 bif_editbox (또는 더 나은 Bif_usenewui)를 설정하여 편집 상자를 갖는 것을 지원합니다.
C ++ 클래스를 살펴보면이를 달성하는 가장 간단한 방법은 생성자 호출의 DWFLAGS 멤버로서 BIF_USENEWUI를 통과시키는 것입니다. (나는 단지 shbrowseforfolder에 직접 전화하고 C ++ 클래스를 귀찮게하지 않으려는 유혹을 받았습니다.)
그러나 MSDN 에서이 플래그에 대한 경고에 주목하십시오.
보다 일반적으로, 사용자가 자신의 목적으로 사용할 수있는 편집 컨트롤을 원한다면 사용자가 무엇이든 입력 할 수있게하는 경우 더 문제가됩니다. 사용자 정의 컨트롤과 함께 Shbrowseforfolder ()가 사용하는 대화 상자를 확장 할 수있는 방법이 없습니다. 그렇게하고 싶다면 결국 전체 대화를 다시 구현해야합니다. 좋은 생각은 아닙니다.
또한 마지막으로, Vista (및 그 너머)로 자신을 제한 할 수 있다면 디렉토리 선택 대화 상자를 갖는 또 다른 방법이 있습니다 : fos_pickfolders 플래그와 함께 새로운 ifiledialog com 인터페이스를 사용하십시오.
다른 팁
어쩌면 이것의 아이디어 중 일부는 당신이 원하는 것을 할 것입니까?
http://www.codeproject.com/kb/dialog/browse_for_folder_dialog.aspx
아니면 이거
http://www.codeguru.com/cpp/wp/files/browserfunctionsdialogs/article.php/c4443