Re: bug in CFileDialog for selecting folders
Tried adding OFN_NOCHANGEDIR too but still the issues persists. But i
have managed to solve it. Dont know whether there is the best way
though.
When the user selects a folder and hits OK, I am calling
SetCurrentDirectory and passing it the users Documents Folder path.
This way it works without issues.
On Jun 23, 7:50 pm, "AliR [VC++ MVP]" <A...@online.nospam> wrote:
Have you tried creating the CFileDialog with the OFN_NOCHANGEDIR flag?
AliR.
"Janma" <rohi...@gmail.com> wrote in message
news:1af62769-18ed-4a8a-89de-02edfee4c788@f19g2000yqh.googlegroups.com...
I am creating an application for selecting folders. So i have created
a new class with CFileDialog as the base class. When the dialog comes
up and i click on a folder and hit Select, then it returns with the
selected folder path. My application then moves on to delete the
selected folder. So i call RemoveDirectory on the returned folder
path. It works fine. But suppose on the folder selection dialog, i
double click the folder i want to delete and then hit select, the
dialog returns with the selected folder path. But i cannot delete the
folder after that unless i close the main dialog. It seems like the
handle of the folder path i selected is still kept open by the dialog
and i cant even delete by windows shift-delete. What could be the
issue here? Is there a bug?
Code is as follows
///////////////////////////////////////////////////////////////////////=
//////
// CFolderDialog
IMPLEMENT_DYNAMIC(CFolderDialog, CFileDialog)
WNDPROC CFolderDialog::m_wndProc = NULL;
// Function name : CFolderDialog::CFolderDialog
// Description : Constructor
// Return type :
// Argument : CString* pPath ; represent string where s=
elected
folder wil be saved
CFolderDialog::CFolderDialog(CString* pPath) : CFileDialog(TRUE, NULL,
_T("*..*"))
{
m_pPath = pPath;
}
BEGIN_MESSAGE_MAP(CFolderDialog, CFileDialog)
//{{AFX_MSG_MAP(CFolderDialog)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// Function name : WindowProcNew
// Description : Call this function when user navigate into
CFileDialog.
// Return type : LRESULT
// Argument : HWND hwnd
// Argument : UINT message
// Argument : WPARAM wParam
// Argument : LPARAM lParam
LRESULT CALLBACK WindowProcNew(HWND hwnd,UINT message, WPARAM wParam,
LPARAM lParam)
{
if (message == WM_COMMAND)
if (HIWORD(wParam) == BN_CLICKED)
if (LOWORD(wParam) == IDOK)
{
if (CFileDialog* pDlg = (CFileDialog*)CWnd::FromHandle(hwnd))
{
TCHAR path[MAX_PATH];
GetCurrentDirectory(MAX_PATH, path);
*((CFolderDialog*)pDlg->GetDlgItem(0))->m_pPath = CString(path);
pDlg->EndDialog(IDOK);
return NULL;
}
}
return CallWindowProc(CFolderDialog::m_wndProc, hwnd, message,
wParam, lParam);
}
// Function name : CFolderDialog::OnInitDone
// Description : For update the wiew of CFileDialog
// Return type : void
void CFolderDialog::OnInitDone()
{
HideControl(edt1);
HideControl(stc3);
HideControl(cmb1);
HideControl(stc2);
CWnd* pFD = GetParent();
CRect rectCancel; pFD->GetDlgItem(IDCANCEL)->GetWindowRect
(rectCancel);
pFD->ScreenToClient(rectCancel);
CRect rectOK; pFD->GetDlgItem(IDOK)->GetWindowRect(rectOK);
pFD->ScreenToClient(rectOK);
pFD->GetDlgItem(IDOK)->SetWindowPos(0,rectCancel.left - rectOK.Width
() - 4, rectCancel.top, 0,0, SWP_NOZORDER | SWP_NOSIZE);
CRect rectList2; pFD->GetDlgItem(lst1)->GetWindowRect(rectList2);
pFD->ScreenToClient(rectList2);
pFD->GetDlgItem(lst1)->SetWindowPos(0,0,0,rectList2.Width(), abs
(rectList2.top - (rectCancel.top - 4)), SWP_NOMOVE | SWP_NOZORDER);
SetControlText(IDOK, _T("Select"));
pFD->SetWindowText(_T("Choose folder"));
m_wndProc = (WNDPROC)SetWindowLong(pFD->m_hWnd, GWL_WNDPROC, (long)
WindowProcNew);
}
Thanks in advance,
Rohit