Pergunta

No MFC, existe uma caixa de diálogo de pasta aberta? Ou seja, em vez de escolher um nome de arquivo, ele escolhe um nome de pasta? Idealmente, eu gostaria que fosse a maneira como o Visual Studio faz isso ao navegar para um "local do projeto" (ao criar um novo projeto), que se parece muito com uma caixa de diálogo normal de arquivo. Mas eu poderia me contentar com um dos Árvore vertical tipo de interfaces se o primeiro não existir.

Foi útil?

Solução

Esse código lhe dará uma caixa de diálogo de pasta aberta (isso foi retirado de algum lugar da web, mas eu realmente não sei onde).

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

Você também terá que implementar esta função de retorno de chamada:

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top