📄 brsfolder.cpp
字号:
// brsfolder.cpp
#include <windows.h>
#include <shlobj.h>
#include <stdlib.h>
#include <string.h>
#include "msc.h"
#include "brsfolder.h"
#include "shfolder.h"
// 暥帤楍偺戙傢傝偵 CSIDL 幆暿巕偑巜掕偝傟偨偐
#define IsSpecifiedCsidl(s) ( (char*) (s) < (char*) 0xFFFF )
//////////////////////////////
// ANSI斉 //
//////////////////////////////
static int CALLBACK SHBrowseProcA ( HWND hWnd, unsigned int dwMessage, LPARAM lParam, LPARAM lpData ) ;
typedef struct {
const char *szTitle ;
const ITEMIDLIST *pInitial ;
} BROWSEFORFOLDERINFOA ;
// 僼僅儖僟慖戰僟僀傾儘僌傪婲摦偡傞乮ANSI斉乯
// ITEMIDLIST 傪曉偡
ITEMIDLIST *WINAPI ShBrowseForFolderA ( HWND hWnd, const ITEMIDLIST *pInitial, const char *szTitle, const char *szMessage, unsigned long dwFlags ) {
BROWSEFORFOLDERINFOA BrowseForFolderInfo ;
BROWSEINFOA BrowseInfo = { 0 } ;
BrowseInfo.hwndOwner = hWnd ;
BrowseInfo.lpfn = SHBrowseProcA ;
BrowseInfo.lParam = (LPARAM) & BrowseForFolderInfo ;
BrowseInfo.lpszTitle = szMessage ;
BrowseInfo.ulFlags = dwFlags ;
BrowseForFolderInfo.szTitle = szTitle ;
BrowseForFolderInfo.pInitial = pInitial ;
return (ITEMIDLIST*) SHBrowseForFolderA ( & BrowseInfo ) ;
}
static int CALLBACK SHBrowseProcA ( HWND hWnd, unsigned int dwMessage, LPARAM lParam, LPARAM lpData ) {
switch ( dwMessage ) {
case BFFM_INITIALIZED :
if ( ((BROWSEFORFOLDERINFOA*)lpData)->szTitle ) SetWindowTextA ( hWnd, ((BROWSEFORFOLDERINFOA*)lpData)->szTitle ) ;
if ( ((BROWSEFORFOLDERINFOA*)lpData)->pInitial ) SendMessageA ( hWnd, BFFM_SETSELECTIONA, FALSE, (LPARAM) ((BROWSEFORFOLDERINFOA*)lpData)->pInitial ) ;
break ;
default :
break ;
}
return 0 ;
}
// 僼僅儖僟慖戰僟僀傾儘僌傪婲摦偡傞乮ANSI斉乯
// szInitialFolder 偼 CSIDL 幆暿巕偱傕壜
// 惉岟偟偨傜 0 傪丄幐攕偟偨傜 0 埲奜傪曉偡
int WINAPI BrowseForFolderA ( HWND hWnd, char *szSelectedFolder, const char *szInitialFolder, const char *szTitle, const char *szMessage, unsigned long dwFlags ) {
int nRetValue = 1 ;
ITEMIDLIST *pInitial ;
if ( IsSpecifiedCsidl ( szInitialFolder ) ) pInitial = ShOpenSpecialItemIdList ( (int)(intptr_t) szInitialFolder ) ;
else pInitial = ShOpenItemIdListA ( szInitialFolder ) ;
ITEMIDLIST *pResult = ShBrowseForFolderA ( hWnd, pInitial, szTitle, szMessage, dwFlags | BIF_RETURNONLYFSDIRS ) ;
if ( pResult ) {
if ( ! ShGetPathA ( pResult, szSelectedFolder ) ) nRetValue = 0 ;
ShCloseItemIdList ( pResult ) ;
}
if ( pInitial ) ShCloseItemIdList ( pInitial ) ;
return nRetValue ;
}
//////////////////////////////
// UNICODE斉 //
//////////////////////////////
// This function is not supported in Win95
#ifndef NTFUNC_IMPORT_IMPLICITLY
#define SHBrowseForFolderW SHBrowseForFolderW_
typedef LPITEMIDLIST ( WINAPI *SHBROWSEFORFOLDERW ) ( LPBROWSEINFOW lpbi ) ;
static HINSTANCE hShell32 ;
static SHBROWSEFORFOLDERW SHBrowseForFolderW ;
static int FreeLibraryOnDetach ( void ) ;
#endif
static int CALLBACK SHBrowseProcW ( HWND hWnd, unsigned int dwMessage, LPARAM lParam, LPARAM lpData ) ;
typedef struct {
const wchar_t *szTitle ;
const ITEMIDLIST *pInitial ;
} BROWSEFORFOLDERINFOW ;
// 僼僅儖僟慖戰僟僀傾儘僌傪婲摦偡傞乮UNICODE斉乯
// ITEMIDLIST 傪曉偡
ITEMIDLIST *WINAPI ShBrowseForFolderW ( HWND hWnd, const ITEMIDLIST *pInitial, const wchar_t *szTitle, const wchar_t *szMessage, unsigned long dwFlags ) {
#ifndef NTFUNC_IMPORT_IMPLICITLY
if ( ! hShell32 && ( hShell32 = LoadLibraryW ( L"SHELL32.DLL" ) ) ) FreeLibraryOnDetach () ;
if ( GETPROCADDRESS ( hShell32, SHBROWSEFORFOLDERW, SHBrowseForFolderW ) ) return NULL ;
#endif
BROWSEFORFOLDERINFOW BrowseForFolderInfo ;
BROWSEINFOW BrowseInfo = { 0 } ;
BrowseInfo.hwndOwner = hWnd ;
BrowseInfo.lpfn = SHBrowseProcW ;
BrowseInfo.lParam = (LPARAM) & BrowseForFolderInfo ;
BrowseInfo.lpszTitle = szMessage ;
BrowseInfo.ulFlags = dwFlags ;
BrowseForFolderInfo.szTitle = szTitle ;
BrowseForFolderInfo.pInitial = pInitial ;
return (ITEMIDLIST*) SHBrowseForFolderW ( & BrowseInfo ) ;
}
static int CALLBACK SHBrowseProcW ( HWND hWnd, unsigned int dwMessage, LPARAM lParam, LPARAM lpData ) {
switch ( dwMessage ) {
case BFFM_INITIALIZED :
if ( ((BROWSEFORFOLDERINFOA*)lpData)->szTitle ) SetWindowTextW ( hWnd, ((BROWSEFORFOLDERINFOW*)lpData)->szTitle ) ;
if ( ((BROWSEFORFOLDERINFOA*)lpData)->pInitial ) SendMessageW ( hWnd, BFFM_SETSELECTIONW, FALSE, (LPARAM) ((BROWSEFORFOLDERINFOW*)lpData)->pInitial ) ;
break ;
default :
break ;
}
return 0 ;
}
// 僼僅儖僟慖戰僟僀傾儘僌傪婲摦偡傞乮UNICODE斉乯
// szInitialFolder 偼 CSIDL 幆暿巕偱傕壜
// 惉岟偟偨傜 0 傪丄幐攕偟偨傜 0 埲奜傪曉偡
int WINAPI BrowseForFolderW ( HWND hWnd, wchar_t *szSelectedFolder, const wchar_t *szInitialFolder, const wchar_t *szTitle, const wchar_t *szMessage, unsigned long dwFlags ) {
int nRetValue = 1 ;
ITEMIDLIST *pInitial ;
if ( IsSpecifiedCsidl ( szInitialFolder ) ) pInitial = ShOpenSpecialItemIdList ( (int)(intptr_t) szInitialFolder ) ;
else pInitial = ShOpenItemIdListW ( szInitialFolder ) ;
ITEMIDLIST *pResult = ShBrowseForFolderW ( hWnd, pInitial, szTitle, szMessage, dwFlags | BIF_RETURNONLYFSDIRS ) ;
if ( pResult ) {
if ( ! ShGetPathW ( pResult, szSelectedFolder ) ) nRetValue = 0 ;
ShCloseItemIdList ( pResult ) ;
}
if ( pInitial ) ShCloseItemIdList ( pInitial ) ;
return nRetValue ;
}
#ifndef NTFUNC_IMPORT_IMPLICITLY
static void __cdecl ExitProc ( void ) {
if ( hShell32 ) FreeLibrary ( hShell32 ) ;
hShell32 = NULL ;
}
#endif
#ifndef NTFUNC_IMPORT_IMPLICITLY
static int FreeLibraryOnDetach ( void ) {
#ifdef _USRDLL
return atexit ( ExitProc ) ;
#else
return 0 ;
#endif
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -