Why FolderBrowserDialog dialog does not scroll to selected folder?

前端 未结 14 1603
失恋的感觉
失恋的感觉 2020-11-30 02:28

As show in this screen shot, the selected folder is not in the view. It needs to be scrolled down to view the selected folder.

14条回答
  •  旧巷少年郎
    2020-11-30 02:51

    I have read the above discussion and solutions. Particularly Brat Oestreicher put me in the right direction. In essence, we must first find the TreeView control in the SHBrowseForFolder dialog, and send that window the TVM_ENSUREVISIBLE message. The following does this in C.

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    // 
    //  EnumCallback - Callback function for EnumWindows 
    // 
    static BOOL CALLBACK EnumCallback(HWND hWndChild, LPARAM lParam)
    {
       char szClass[MAX_PATH];
       HTREEITEM hNode;
       if (GetClassName(hWndChild, szClass, sizeof(szClass))
       &&  strcmp(szClass,"SysTreeView32")==0) {
          hNode = TreeView_GetSelection(hWndChild);    // found the tree view window
          TreeView_EnsureVisible (hWndChild, hNode);   // ensure its selection is visible
          return(FALSE);   // done; stop enumerating
       }
       return(TRUE);       // continue enumerating
    }
    // 
    //  BrowseCallbackProc - Callback function for SHBrowseForFolder 
    // 
    static INT CALLBACK BrowseCallbackProc (HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) 
    {
        switch (uMsg) 
        { 
            case BFFM_INITIALIZED:
                SendMessage (hWnd, BFFM_SETEXPANDED, TRUE, lpData);    // expand the tree view
                SendMessage (hWnd, BFFM_SETSELECTION, TRUE, lpData);   // select the item
                break;
            case BFFM_SELCHANGED:
                EnumChildWindows(hWnd, EnumCallback,0);
                break;
        } 
        return 0; 
    } 
    // 
    //  SelectDirectory - User callable entry point 
    // 
    int SelectDirectory (HWND hWndParent, char *path, int pathSize) 
    { 
        BROWSEINFO bi = {0};
        LPITEMIDLIST pidl = NULL;
        wchar_t ws[MAX_PATH];
    
        CoInitialize(0);
        if (pathSize < MAX_PATH) return(FALSE);
    
        swprintf(ws, MAX_PATH, L"%hs", path);
    
        bi.hwndOwner = hWndParent; 
        bi.lpszTitle = "Select Directory"; 
        bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
        bi.lpfn = BrowseCallbackProc;
        bi.lParam = (LPARAM) ws;
    
        pidl = SHBrowseForFolder (&bi); 
        if (pidl != NULL) 
        { 
            LPMALLOC pMalloc = NULL; 
            SHGetPathFromIDList (pidl, path);
            path[pathSize-1]= '\0';
    
            SHGetMalloc(&pMalloc);
            pMalloc->lpVtbl->Free(pMalloc,pidl);    // deallocate item 
            pMalloc->lpVtbl->Release(pMalloc);
    
            return (TRUE);
        } 
        return (FALSE);
    } 
    

    Many thanks to Gary Beene.

提交回复
热议问题