سؤال

في MFC ، هل يوجد حوار مجلد مفتوح؟ هذا هو ، بدلاً من اختيار اسم الملف ، يختار اسم المجلد؟ من الناحية المثالية ، أود أن تكون الطريقة التي يقوم بها Visual Studio عند التنقل في "موقع المشروع" (عند إنشاء مشروع جديد) ، والذي يشبه إلى حد كبير مربع حوار الملف العادي. لكن يمكنني أن أفعل مع أحد شجرة عمودية نوع من الواجهات إذا كان الأول غير موجود.

هل كانت مفيدة؟

المحلول

سيحصل هذا الرمز على مربع حوار مجلد مفتوح (تم أخذ هذا من مكان ما على الويب ولكني لا أعرف حقًا أين).

CString szSelectedFolder = _T("");

// This is the recommended way to select a directory
// in Win95 and NT4.
BROWSEINFO bi;
memset((LPVOID)&bi, 0, sizeof(bi));
TCHAR szDisplayName[_MAX_PATH];
szDisplayName[0] = '\0';
bi.hwndOwner = GetSafeHwnd();
bi.pidlRoot = NULL;
bi.pszDisplayName = szDisplayName;
bi.lpszTitle = _T("Select a folder");
bi.ulFlags = BIF_RETURNONLYFSDIRS;
// Set the callback function
bi.lpfn = BrowseCallbackProc;

LPITEMIDLIST pIIL = ::SHBrowseForFolder(&bi);
TCHAR szReturnedDir[_MAX_PATH];

BOOL bRet = ::SHGetPathFromIDList(pIIL, (TCHAR*)&szReturnedDir);
if (bRet)
{
    if (szReturnedDir != _T(""))
    {
        szSelectedFolder = szReturnedDir;
    }

    LPMALLOC pMalloc;
    HRESULT HR = SHGetMalloc(&pMalloc);
    pMalloc->Free(pIIL);
    pMalloc->Release();
}

سيكون عليك أيضًا تنفيذ وظيفة رد الاتصال هذه:

TCHAR szInitialDir[_MAX_PATH];

// Set the initial path of the folder browser
int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
    // Look for BFFM_INITIALIZED
    if (uMsg == BFFM_INITIALIZED)
    {
        SendMessage(hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)szInitialDir);
    }
    return 0;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top