您的位置:首页 > 其它

SHBrowseForFolder 的一些使用

2011-02-12 16:46 429 查看
SHBrowseForFolder是一个可以用于获取文件夹路径的Windows API。使用起来可以方便很多,近来在写程序时用到了,现在总结一下。

  首先当然要有一些基本认识才行。所以先看一下下面所列的MSDN。 http://msdn.microsoft.com/en-us/library/bb762115%28VS.85%29.aspx http://msdn.microsoft.com/en-us/library/bb773205%28VS.85%29.aspx

[align=left]SHBrowseForFolder是一个可以用于获取文件夹路径的Windows API。使用起来可以方便很多,近来在写程序时用到了,现在总结一下。[/align]
[align=left]  首先当然要有一些基本认识才行。所以先看一下下面所列的MSDN。[/align]
[align=left]http://msdn.microsoft.com/en-us/library/bb762115%28VS.85%29.aspx[/align]
[align=left]http://msdn.microsoft.com/en-us/library/bb773205%28VS.85%29.aspx[/align]
[align=left]看完了上面的再往下看吧。[/align]
[align=left]view plaincopy to clipboardprint?[/align]

[align=left]1. // The following code to get a folder path which you //select. [/align]
[align=left]2. BOOL ShellGetOutPath(HANDLE hDlg, LPTSTR lpszRoot, LPTSTR lpszPath, LPCTSTR lpszDesc/* = 0*/) [/align]
[align=left]3. { [/align]
[align=left]4. BOOL bRet; [/align]
[align=left]5. //TCHAR szPath[MAX_PATH]; [/align]
[align=left]6. LPITEMIDLIST lpil; [/align]
[align=left]7. //HGLOBAL hgMem; [/align]
[align=left]8. [/align]
[align=left]9. // the following segment define and initialize the BROWSEINFO, prepareing for the SHBrowseForFolder API [/align]
[align=left]10. BROWSEINFO bi; [/align]
[align=left]11. bi.hwndOwner=(HWND) hDlg; [/align]
[align=left]12. IShellFolder *ppshf; [/align]
[align=left]13. SHGetDesktopFolder(&ppshf); [/align]
[align=left]14. if(!ppshf) [/align]
[align=left]15. return FALSE; [/align]
[align=left]16. LPITEMIDLIST pidlRoot = NULL; [/align]
[align=left]17. ppshf->ParseDisplayName((HWND)hDlg, NULL, lpszRoot, NULL, &pidlRoot, NULL); [/align]
[align=left]18. if(!pidlRoot) [/align]
[align=left]19. return FALSE; [/align]
[align=left]20. bi.pidlRoot = pidlRoot; [/align]
[align=left]21. bi.pszDisplayName = lpszPath;//szPath; [/align]
[align=left]22. //strMsg.LoadString(IDS_STR_FOLDER_OUTPUT); [/align]
[align=left]23. bi.lpszTitle = lpszDesc; [/align]
[align=left]24. bi.ulFlags = /*BIF_DONTGOBELOWDOMAIN |*/BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE ; [/align]
[align=left]25. bi.lpfn = BFFCALLBACK(BrowseCallbackProcInit); [/align]
[align=left]26. bi.lParam = (LPARAM)lpszPath; [/align]
[align=left]27. lpil = SHBrowseForFolder(&bi); [/align]
[align=left]28. if(lpil == NULL) [/align]
[align=left]29. return FALSE; [/align]
[align=left]30. bRet = SHGetPathFromIDList(lpil, lpszPath); [/align]
[align=left]31. CoTaskMemFree(lpil); [/align]
[align=left]32. //CString strPath = lpszPath; [/align]
[align=left]33. TCHAR szDrive[_MAX_DRIVE]; [/align]
[align=left]34. _tsplitpath(lpszPath, szDrive, NULL, NULL, NULL); [/align]
[align=left]35. return bRet; [/align]
[align=left]36.} [/align]

[align=left]view plaincopy to clipboardprint?[/align]

[align=left]1. // the callback function for the BROWSEINFO, to implement your own function [/align]
[align=left]2. // here I try to do that: [/align]
[align=left]3. // 1, when the user slelect CD/DVD drives, the OK and Make New Folder button [/align]
[align=left]4. // will be disable. [/align]
[align=left]5. // 2, Change the title of the dialogbox. [/align]
[align=left]6. int CALLBACK BrowseCallbackProcInit(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) [/align]
[align=left]7. { [/align]
[align=left]8. TCHAR szPath[MAX_PATH]; [/align]
[align=left]9. // TCHAR szTargetPath[MAX_PATH]; [/align]
[align=left]10. TCHAR szDrive[MAX_PATH], szDir[MAX_PATH], szFile[MAX_PATH], szExt[MAX_PATH]; [/align]
[align=left]11. LPCITEMIDLIST pidl; [/align]
[align=left]12. // WIN32_FIND_DATA FileData; [/align]
[align=left]13. // HANDLE hSearch; [/align]
[align=left]14. static HWND hMakeNewFolder=NULL; [/align]
[align=left]15. [/align]
[align=left]16. TCHAR szWindosText[MAX_PATH+1]; [/align]
[align=left]17. switch(uMsg) [/align]
[align=left]18. { [/align]
[align=left]19. case BFFM_SELCHANGED: [/align]
[align=left]20. { [/align]
[align=left]21. pidl = LPCITEMIDLIST(lParam); [/align]
[align=left]22. SHGetPathFromIDList(pidl, szPath); [/align]
[align=left]23. if (szPath[0] == '\0') [/align]
[align=left]24. SendMessage(hwnd, BFFM_ENABLEOK, lParam, 0); [/align]
[align=left]25. _tsplitpath(szPath, szDrive, szDir, szFile, szExt); [/align]
[align=left]26. TCHAR szRoot[MAX_PATH+1]; [/align]
[align=left]27. lstrcpyn(szRoot,szPath, MAX_PATH); [/align]
[align=left]28. ::PathStripToRoot(szRoot); [/align]
[align=left]29. // disable when select CD/DVD drive, otherwise enables [/align]
[align=left]30. if(GetDriveType(szRoot)==DRIVE_CDROM) [/align]
[align=left]31. { [/align]
[align=left]32. HWND btnHwnd=GetDlgItem(hwnd,IDOK); [/align]
[align=left]33. ::EnableWindow( btnHwnd, FALSE); [/align]
[align=left]34. if(hMakeNewFolder) [/align]
[align=left]35. ::EnableWindow(hMakeNewFolder,FALSE); [/align]
[align=left]36. //SendMessage(hwnd,BFFM_SETSELECTION ,TRUE ,(LPARAM)(_T("C:\\"))); [/align]
[align=left]37. } [/align]
[align=left]38. else [/align]
[align=left]39. { [/align]
[align=left]40. HWND btnHwnd=GetDlgItem(hwnd,IDOK); [/align]
[align=left]41. ::EnableWindow( btnHwnd, TRUE); [/align]
[align=left]42. if(hMakeNewFolder) [/align]
[align=left]43. ::EnableWindow(hMakeNewFolder,TRUE); [/align]
[align=left]44. } [/align]
[align=left]45. [/align]
[align=left]46. } [/align]
[align=left]47. break; [/align]
[align=left]48. case BFFM_INITIALIZED: [/align]
[align=left]49. { [/align]
[align=left]50. SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)(LPCTSTR)lpData); [/align]
[align=left]51. //if (szLastPath[0] == '\0') [/align]
[align=left]52. // SendMessage(hwnd, BFFM_ENABLEOK, lParam, 0); [/align]
[align=left]53. //Change the caption of the Browse for Folder caption [/align]
[align=left]54. CString szCaption((LPCTSTR)lpData); [/align]
[align=left]55. if(szCaption.GetLength()>2) [/align]
[align=left]56. { [/align]
[align=left]57. szCaption.LoadString(IDS_SAVE_AGENT_INSTALLER); [/align]
[align=left]58. SetWindowText(hwnd,szCaption); [/align]
[align=left]59. } [/align]
[align=left]60. HWND hChild=GetWindow(hwnd, GW_CHILD); [/align]
[align=left]61. //Get the tree view handle [/align]
[align=left]62. //while(hChild) [/align]
[align=left]63. //{ [/align]
[align=left]64. // TCHAR szClass[256]; [/align]
[align=left]65. // GetClassName(hChild, szClass, 255); [/align]
[align=left]66. // // [/align]
[align=left]67. // if (strcmp(szClass, _T("SHBrowseForFolder ShellNameSpace Control")) == 0) [/align]
[align=left]68. // { [/align]
[align=left]69. // hTree=hChild; [/align]
[align=left]70. // break; [/align]
[align=left]71. // } [/align]
[align=left]72. // hChild = GetNextWindow(hChild, GW_HWNDNEXT); [/align]
[align=left]73. //} [/align]
[align=left]74. while(hChild) [/align]
[align=left]75. { [/align]
[align=left]76. GetWindowText(hChild,szWindosText,MAX_PATH); [/align]
[align=left]77. TCHAR szText[]=_T("&Make New Folder"); [/align]
[align=left]78. if(lstrcmp(szWindosText,szText)==0) [/align]
[align=left]79. { [/align]
[align=left]80. //find and keep the make new folder button handle [/align]
[align=left]81. hMakeNewFolder=hChild; [/align]
[align=left]82. //::OutputDebugString(_T("find the control")); [/align]
[align=left]83. //::OutputDebugString(szWindosText); [/align]
[align=left]84. break; [/align]
[align=left]85. } [/align]
[align=left]86. hChild = GetNextWindow(hChild, GW_HWNDNEXT); [/align]
[align=left]87. } [/align]
[align=left]88. [/align]
[align=left]89. } [/align]
[align=left]90. break; [/align]
[align=left]91. } [/align]
[align=left]92. return 0; [/align]
[align=left]93.} [/align]

[align=left]上面就完成了一个使用SHBrowseForFolder的基本例子。另外也对基本的例子有了一些扩充。[/align]
本文出自 “会飞de树(往github迁移中)” 博客,请务必保留此出处http://wellwy.blog.51cto.com/1609602/491992
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: