SourceForge.jp

dkutilCommonControl.h

説明を見る。
00001 #ifndef _dkutil_CommonControl__
00002 #define _dkutil_CommonControl__
00003 
00004 
00005 #ifdef USE_DKINGYO_SHELL_AND_COMMON_CONTROL
00006 
00007 #include <shlobj.h>
00008 #include <mbstring.h>
00009 #include <Shlwapi.h>
00010 #include <objbase.h>
00011 #include <commctrl.h>
00012 //#include <winnls32.h> こいつがあると、英語版Windowsで起動できねぇ!
00013 #include <imm.h>
00014 #include <basetsd.h>
00015 //#include <mmreg.h>
00016 #include "dKingyoMacro.h"
00017 #include "dkutilDefined.h"
00018 #include "dkutilStdio.h"
00019 #include "dkutilDLLManager.h"
00020 
00021 #if _MSC_VER >= 1200
00022 #pragma comment(lib,"comctl32")
00023 #pragma comment(lib,"imm32")
00024 #endif
00025 ;
00026 namespace dkutil{
00027 
00034 inline bool SetShowIME(HWND wnd, bool flag )
00035 {
00036     typedef int (PASCAL *SETIME_TYPE)(HWND,int);
00037     if(wnd==NULL) return false;
00038 
00039     {
00040         const int num = 4;
00041         const char *dlltbl[num]={
00042             "WINNLS32.DLL","winnls.dll",
00043             "user32.dll","win32nls.dll"
00044         };
00045         const char *prctbl[num]={
00046             "WINNLSEnableIME","WINNLSEnableIME",
00047             "WINNLSEnableIME"," WINNLS32EnableIME"
00048         };
00049         SETIME_TYPE SetIME=NULL;
00050         DLLManager f;
00051         for(int i=0;i<num;i++){
00052             f.reset(dlltbl[i]);
00053             
00054             SetIME = (SETIME_TYPE)f.find(prctbl[i]);
00055             if(SetIME){
00056                 SetIME(wnd,flag);
00057                 return true;
00058             }
00059         }
00060     }
00061     return false;
00062 }
00063 
00064 class FolderSelector{
00065 public:
00074     int FolderSelectLogic(char *GetPath,size_t BuffSize,
00075         const char *folder=NULL,const char *Title=NULL,
00076         UINT Flag=BIF_EDITBOX,HWND WindowHandle=NULL)
00077     {
00078         if(BuffSize == 0) return edk_FAILED;
00079         char *pDir = GetPath;
00080         pDir[0] = '\0';
00081 
00082         HRESULT hr;
00083         BROWSEINFO bi={0};
00084         ITEMIDLIST *lpid = NULL;
00085         LPMALLOC pMalloc = NULL;
00086 
00087         bi.hwndOwner    = WindowHandle;
00088         bi.ulFlags      = Flag;
00089         if(!Title){
00090             bi.lpszTitle    = "ディレクトリ指定";
00091         }else{
00092             bi.lpszTitle = Title;
00093         }
00094         if(folder){
00095             bi.lpfn   = BrowseCallbackProc; // コールバーク関数
00096             bi.lParam = (LPARAM)folder;       // 初期フォルダ
00097         }
00098         //表示ing
00099         lpid = ::SHBrowseForFolder( &bi );
00100 
00101         if ( lpid == NULL )
00102         {
00103             //cancelが押された。
00104             return edk_Not_Selected;
00105         }
00106         else
00107         {
00108             hr = ::SHGetMalloc( &pMalloc );
00109             if ( hr == E_FAIL )
00110             {
00111                 MessageBox(WindowHandle,  "SHGetMalloc Error", "Error",MB_OK);
00112                 return edk_FAILED;
00113             }
00114 
00115             ::SHGetPathFromIDList( lpid, pDir );
00116             if ( pDir[strlen(pDir) - 1] != '\\' ){
00117                 dkstrcat_amap(pDir,BuffSize,strlen(pDir),"\\",strlen("\\"));
00118                 //strcat( pDir, "\\" );
00119             }
00120 
00121             pMalloc->Free( lpid );
00122             pMalloc->Release();
00123         }
00124         return edk_SUCCEEDED;
00125     }
00126     FolderSelector(char *GetPath,size_t BuffSize,const char *folder,bool *flag){
00127         *flag = DKUTIL_SUCCEEDED(FolderSelectLogic(GetPath,BuffSize,folder));
00128     }
00129     //何もしないコンストラクタ。
00130     FolderSelector(){}
00136     FolderSelector(std::string &GetPath,const char *folder=NULL)
00137     {
00138         GetPath.clear();
00139         char path[MAX_PATH]="";
00140         FolderSelectLogic(path,sizeof(path),folder);
00141         GetPath = path;
00142     }
00143     // コールバーク関数
00144     static int CALLBACK BrowseCallbackProc( HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData )
00145     {
00146         // フォルダ選択ダイアログの初期化
00147         if ( (BFFM_INITIALIZED == uMsg) && lpData ){
00148             SendMessage( hWnd, BFFM_SETSELECTION, TRUE, lpData );
00149         }
00150         return 0;
00151     }//BrowseCallbackProc
00152 
00153 
00154 };
00155 inline bool EasyFolderSelect(char *buff,size_t buffsize){
00156     FolderSelector sel;
00157     return DKUTIL_SUCCEEDED(sel.FolderSelectLogic(buff,buffsize));
00158 }
00159 
00160 }//end of dkutil namespace
00161 
00162 
00163 #endif//end of USE_DKINGYO_SHELL_AND_COMMON_CONTROL
00164 #endif//end of include once

dkutil 1.02リリース前 d金魚専用マニュアルバージョンに対してSun Dec 28 21:23:07 2003に生成されました。 doxygen 1.3.5