// フォルダ・ファイル名をメニューとして追加する関数(再帰) // (C)2002,2003 Yutaka Wada, AirparkLab // [注意] // 相対パスで読み込めるように便宜上ヘッダファイルにしている。 // インクルードするのは唯一のソースファイルのみとし、他はextern宣言して使用すること。 #ifndef __CRATE_FOLDER_MENU_H__ #define __CRATE_FOLDER_MENU_H__ // プロトタイプ宣言 void CreateFolderMenu( CString *pDir, CMenu *pMenu, CStringArray *pItemArray, int IDbase ); // フォルダ・ファイル名をメニューとして追加する関数(再帰) void CreateFolderMenu( CString *pDir, CMenu *pMenu, CStringArray *pItemArray, int IDbase ) { HANDLE hFile; // 検索ハンドル WIN32_FIND_DATA data; // 発見ファイル情報を受ける変数 CString Path; // 検索パス名 CString Filename; // 検索ファイル(ディレクトリ)名 CString Folder; // 検索フォルダ(末尾の'\'あり) int num; // アイテム数 // 末尾の'\'処理(SJISコード対応) int nLen = pDir->GetLength(); if( nLen >= 2 && (unsigned char)((*pDir)[nLen-2]) < 0x81 && (*pDir)[nLen-1] == '\\' ) Folder = *pDir; else if( nLen >= 3 && (unsigned char)((*pDir)[nLen-3]) >= 0x81 && (*pDir)[nLen-1] == '\\' ) Folder = *pDir; else Folder = *pDir + "\\"; Path.Format( "%s*.*", (LPCSTR)Folder ); num = 0; // 先にフォルダを検索 hFile = FindFirstFile( (LPCSTR)Path, &data ); if( hFile != INVALID_HANDLE_VALUE ){ do{ if( strcmp( ".", data.cFileName ) && strcmp( "..", data.cFileName ) ){ // ファイル(フォルダ)名の決定 Filename.Format( "%s%s", (LPCSTR)Folder, data.cFileName ); // フォルダなら再帰的にメニューアイテムを作成 if( data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ){ // ポップアップメニューを追加 CMenu SubMenu; SubMenu.CreatePopupMenu(); CreateFolderMenu( &Filename, &SubMenu, pItemArray, IDbase ); pMenu->AppendMenu( MF_POPUP, (UINT)SubMenu.Detach(), data.cFileName ); } num++; } } while( FindNextFile( hFile, &data ) ); // 次のファイルを検索 FindClose( hFile ); // ハンドルの後始末 } // 次にファイルを検索 hFile = FindFirstFile( (LPCSTR)Path, &data ); if( hFile != INVALID_HANDLE_VALUE ){ do{ if( strcmp( ".", data.cFileName ) && strcmp( "..", data.cFileName ) ){ // ファイル名の決定 Filename.Format( "%s%s", (LPCSTR)Folder, data.cFileName ); // ファイルならメニューアイテムを作成 if( !(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ){ pItemArray->Add( Filename ); pMenu->AppendMenu( MF_STRING, IDbase+pItemArray->GetSize()-1, data.cFileName ); } num++; } } while( FindNextFile( hFile, &data ) ); // 次のファイルを検索 FindClose( hFile ); // ハンドルの後始末 } // フォルダもファイルもなければメニューアイテムなし if( num == 0 ) pMenu->AppendMenu( MF_STRING|MF_GRAYED, 0, "(なし)" ); } /* [使用例] CString Path = "C:\WINDOWS\FAVORITE"; // 検索パス CStringArray ItemArray; // 実行されたメニューID-1000を添え字として持つお気に入りファイル名配列 ItemArray.RemoveAll(); CreateFolderMenu( &Path, pMenu, &ItemArray, 1000 ); 各ファイルはファイル名と検索順のメニューIDによってAppendMenu()され、フルパス名が CStringArrayに登録されるので、メニュー実行ハンドラではIDからCStringArrayをアクセスし 項目のフルパス名を得ることができます。 */ #endif