⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shbrowsedlg.cpp

📁 3D游戏场景编辑器
💻 CPP
字号:
//*-
//
// MODULE NAME:   SHBrowseDlg.cpp
//
// DESCRIPTION:   CSHBrowseDlg class implementation
//
// AUTHOR     :   Stefano Passiglia, January 1998
//                passig@geocities.com
//                You can reuse and redistribute this code, provided this header is
//                kept as is.
//+*/


//
// Include Files
//
#include "stdafx.h"

#include "SHBrowseDlg.h"


//
// Global variables.
//


//
// Local constant definitions.
//
#ifdef _DEBUG
#  define new DEBUG_NEW
#  undef THIS_FILE
   static char THIS_FILE[] = __FILE__;
#endif

//
// Local type definitions.
//

// Struct used by the callback function
typedef struct _SB_INITDATA
{
   char         *lpszInitialDir;
   CSHBrowseDlg *pSHBrowseDlg;
} SB_INITDATA, *LPSB_INITDATA;


//
// Local defines
//



//
// Local function declarations.
//

// Dialog callback


//
// Local class declarations.
//
// None.


   
               ///////////////////////////////////////////////
               //          CONSTRUCTORS/DESTRUCTOR          //
               ///////////////////////////////////////////////



///*-
// FUNCTION NAME: CSHBrowseDlg::CSHBrowseDlg
//
// DESCRIPTION:   CSHBrowseDlg class constructor
//
// PARAMETER(S):
//                hwndParent:
//                   TYPE:          HWND
//                   MODE:          In
//                   MECHANISM:     By value
//                   DESCRIPTION:   Dialog parent window handle
//
//                szHint:
//                   TYPE:          char
//                   MODE:          In
//                   MECHANISM:     By reference
//                   DESCRIPTION:   Pointer to the dialog hint
//
// RETURN:        None
//
// NOTES:         None
//+*/
CSHBrowseDlg::CSHBrowseDlg( HWND   hWndOwner, 
                            LPCSTR szHint ) :
   m_hWndOwner(hWndOwner)
{
   if ( szHint )
   {
      lstrcpy( m_szHint, szHint );
   }

   // Initialize path strings
   m_szDirFullPath[0] = m_szDisplayName[0] = 0;

   // Retrieve IShellFolder interface
   SHGetDesktopFolder( &m_pSHFolder );

   // Retrieve IMalloc
   SHGetMalloc( &m_pMalloc );
} // CSHBrowseDlg::CSHBrowseDlg()

   
///*-
// FUNCTION NAME: CSHBrowseDlg::~CSHBrowseDlg
//
// DESCRIPTION:   CSHBrowseDlg class destructor
//
// PARAMETER(S):  None.
//
// RETURN:        None
//
// NOTES:         None
//+*/
CSHBrowseDlg::~CSHBrowseDlg()
{
   // Release ISHFolder/IMalloc interfaces
   m_pSHFolder->Release();
   m_pMalloc->Release();
} // CSHBrowseDlg::~CSHBrowseDlg()


   
               ///////////////////////////////////////////////
               //             PUBLIC FUNCTIONS              //
               ///////////////////////////////////////////////



///*-
// FUNCTION NAME: CSHBrowseDlg::DoModal
//
// DESCRIPTION:   Shows the dialog
//
// PARAMETER(S):
//                lpszInitialDir:
//                   TYPE:          char
//                   MODE:          In
//                   MECHANISM:     By reference
//                   DESCRIPTION:   Pointer to the string containing 
//                                  the initial path 
//                uRoot:
//                   TYPE:          UINT
//                   MODE:          In
//                   MECHANISM:     By value
//                   DESCRIPTION:   Root of the browsing tree
//                                  (default: desktop)
//
//                uFlags:
//                   TYPE:          UINT
//                   MODE:          In
//                   MECHANISM:     By value
//                   DESCRIPTION:   Specifies additional flags 
//                                  (see SHBrowseForFolder help)
//
// RETURN:        None
//
// NOTES:         None
//+*/
BOOL CSHBrowseDlg::DoModal( LPSTR lpszInitialDir,
                            UINT  uRoot,
                            UINT  uFlags 
                          )
{
   BOOL bResult = TRUE;

   SB_INITDATA sbInit = { lpszInitialDir, this };

   // Get tree root
   LPITEMIDLIST lpidList;
   SHGetSpecialFolderLocation( m_hWndOwner, uRoot, &lpidList );
   
   // Initialize BROWSEINFO structure
   BROWSEINFO biInfo;
   biInfo.hwndOwner      = m_hWndOwner;
   biInfo.pidlRoot       = lpidList;
   biInfo.pszDisplayName = m_szDisplayName;
   biInfo.lpszTitle      = m_szHint;
   biInfo.ulFlags        = BIF_STATUSTEXT | uFlags;
   biInfo.lpfn           = BFFCALLBACK( SHBrowseCallBack );
   biInfo.lParam         = LPARAM( &sbInit );
   biInfo.iImage         = 0;
   
   // Show the dialog
   LPITEMIDLIST pidl = SHBrowseForFolder( &biInfo );
   
   bResult = (pidl != NULL);
   if ( bResult )
   {
      // "OK" pressed
      // Try to retrieve path name
      if ( !SHGetPathFromIDList(pidl, m_szDirFullPath) && (*m_szDisplayName == 0) )
      {
         bResult = FALSE;
      }
      
      // Give memory back to the system using IMalloc interface
      m_pMalloc->Free( reinterpret_cast< void * >( pidl ) );
      
   }

   return bResult;
} // CSHBrowseDlg::DoModal()



///*-
// FUNCTION NAME: CSHBrowseDlg::GetFullPath
//
// DESCRIPTION:   Retrieves selected folder full path
//
// PARAMETER(S):  None.
//
// RETURN:        CString object.
//
// NOTES:         None.
//+*/
char *CSHBrowseDlg::GetFullPath()
{
   return &m_szDirFullPath[0];
} // CSHBrowseDlg::GetFullPath()


///*-
// FUNCTION NAME: CSHBrowseDlg::GetFolderName
//
// DESCRIPTION:   Retrieves selected folder name
//
// PARAMETER(S):  None.
//
// RETURN:        char *.
//
// NOTES:         None.
//+*/
char *CSHBrowseDlg::GetFolderName()
{
   return &m_szDisplayName[0];
} // CSHBrowseDlg::GetFolderName()


   
               ///////////////////////////////////////////////
               //             BROWSE CALLBACK               //
               ///////////////////////////////////////////////



///*-
// FUNCTION NAME: CSHBrowseDlg::SHBrowseCallBack
//
// DESCRIPTION:   Browse dialog callback
//
// PARAMETER(S):
//                hWnd:
//                   TYPE:          HWND
//                   MODE:          In
//                   MECHANISM:     By value
//                   DESCRIPTION:   Handle of the dialog
//
//                uMsg:
//                   TYPE:          UIN
//                   MODE:          In
//                   MECHANISM:     By value
//                   DESCRIPTION:   Message identifier 
// 
//                lParam:
//                   TYPE:          LPARAM
//                   MODE:          In
//                   MECHANISM:     By value
//                   DESCRIPTION:   Message-dependent value
//
//
//                lpData:
//                   TYPE:          LPARAM
//                   MODE:          In
//                   MECHANISM:     By value
//                   DESCRIPTION:   Application-dependent value 
//
//
// RETURN:        Zero, always
//
// NOTES:         Used only to set initial dir and initialize subclassing.
//+*/
int WINAPI CSHBrowseDlg::SHBrowseCallBack( HWND   hWnd, 
                                           UINT   uMsg, 
                                           LPARAM lParam, 
                                           LPARAM lpData )
{
   static CSHBrowseDlg *pSBDlg = reinterpret_cast< LPSB_INITDATA >(lpData)->pSHBrowseDlg;

   if ( uMsg == BFFM_INITIALIZED )
   {
      // Set initial directory
      if ( lpData && *(char *)lpData )
      {
         ::SendMessage( hWnd, 
                        BFFM_SETSELECTION, 
                        TRUE, 
                        LPARAM(LPSB_INITDATA(lpData)->lpszInitialDir)
                      );
      }
      pSBDlg->m_hWndTreeView = FindWindowEx( hWnd, NULL, WC_TREEVIEW, NULL );
   }
   else
   if ( uMsg == BFFM_SELCHANGED )
   {
      pSBDlg->GetNames( LPCITEMIDLIST(lParam) );

      // Update status text
      if ( *pSBDlg->m_szDirFullPath )
      {
         ::SendMessage( hWnd, 
                        BFFM_SETSTATUSTEXT, 
                        0,
                        LPARAM(pSBDlg->m_szDirFullPath) );
      }
      else
      {
         ::SendMessage( hWnd, 
                        BFFM_SETSTATUSTEXT, 
                        0,
                        LPARAM(pSBDlg->m_szDisplayName) );
      }

   }
      

   return 0;
} // SHBrowseCallBack()


   
               ///////////////////////////////////////////////
               //             PRIVATE FUNCTIONS             //
               ///////////////////////////////////////////////



///*-
// FUNCTION NAME: CSHBrowseDlg::GetNames
//
// DESCRIPTION:   Retrieves full path and display name of the selected treeview item
//
// PARAMETER(S):  
//                pidl:
//                   TYPE:          ITEMIDLIST
//                   MODE:          In
//                   MECHANISM:     By reference
//                   DESCRIPTION:   Pointer to the item identifier list
//
// RETURN:        None.
//
// NOTES:         None.
//+*/
void CSHBrowseDlg::GetNames( LPCITEMIDLIST pidl )
{
   HTREEITEM hSelected;
   TV_ITEM   tvSelected;

   // Get full path
   SHGetPathFromIDList( pidl, m_szDirFullPath );

   // Now retrieve display name.
   hSelected = TreeView_GetSelection( m_hWndTreeView );
   tvSelected.mask       = TVIF_HANDLE | TVIF_TEXT;
   tvSelected.hItem      = hSelected;
   tvSelected.pszText    = m_szDisplayName;
   tvSelected.cchTextMax = MAX_PATH;
   TreeView_GetItem( m_hWndTreeView, &tvSelected );
} // CSHBrowseDlg::GetNames()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -