5128eecc9f 2011-02-23 kinaba: //--- K.I.LIB --- 5128eecc9f 2011-02-23 kinaba: // kl_wcmn.h : windows-common-interface operatin 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: #include "stdafx.h" 5128eecc9f 2011-02-23 kinaba: #include "kilib.h" 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: static int CALLBACK __ki__ofp( HWND w, UINT m, LPARAM l, LPARAM d ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: if( m==BFFM_INITIALIZED && d ) 5128eecc9f 2011-02-23 kinaba: ::SendMessage( w, BFFM_SETSELECTION, TRUE, d ); 5128eecc9f 2011-02-23 kinaba: return 0; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: bool kiSUtil::getFolderDlg( char* buf, HWND par, const char* title, const char* def ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: // 情報セット 5128eecc9f 2011-02-23 kinaba: BROWSEINFO bi; 5128eecc9f 2011-02-23 kinaba: ki_memzero( &bi, sizeof(bi) ); 5128eecc9f 2011-02-23 kinaba: bi.hwndOwner = par; 5128eecc9f 2011-02-23 kinaba: bi.pszDisplayName = buf; 5128eecc9f 2011-02-23 kinaba: bi.lpszTitle = title; 5128eecc9f 2011-02-23 kinaba: bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN; 5128eecc9f 2011-02-23 kinaba: bi.lpfn = __ki__ofp; 5128eecc9f 2011-02-23 kinaba: bi.lParam = (long)def; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // ダイアログ表示 5128eecc9f 2011-02-23 kinaba: ITEMIDLIST* id = SHBrowseForFolder( &bi ); 5128eecc9f 2011-02-23 kinaba: if( id==NULL ) 5128eecc9f 2011-02-23 kinaba: return false; 5128eecc9f 2011-02-23 kinaba: SHGetPathFromIDList( id, buf ); 5128eecc9f 2011-02-23 kinaba: app()->shellFree( id ); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // 終了 5128eecc9f 2011-02-23 kinaba: return true; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiSUtil::getFolderDlgOfEditBox( HWND wnd, HWND par, const char* title ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char str[MAX_PATH]; 5128eecc9f 2011-02-23 kinaba: ::SendMessage( wnd, WM_GETTEXT, MAX_PATH, (LPARAM)str ); 5128eecc9f 2011-02-23 kinaba: for( char* x=str,*l=str; *x; x=kiStr::next(x) ) 5128eecc9f 2011-02-23 kinaba: l=x; 5128eecc9f 2011-02-23 kinaba: if( *l=='\\' || *l=='/' ) 5128eecc9f 2011-02-23 kinaba: *l='\0'; 5128eecc9f 2011-02-23 kinaba: if( getFolderDlg( str, par, title, str ) ) 5128eecc9f 2011-02-23 kinaba: ::SendMessage( wnd, WM_SETTEXT, 0, (LPARAM)str ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: int kiSUtil::getSysIcon( const char* ext ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: SHFILEINFO fi; 5128eecc9f 2011-02-23 kinaba: ::SHGetFileInfo( 5128eecc9f 2011-02-23 kinaba: kiPath("test.")+=ext, 0, &fi, sizeof(fi), 5128eecc9f 2011-02-23 kinaba: SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_SMALLICON ); 5128eecc9f 2011-02-23 kinaba: return fi.iIcon; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiSUtil::msgLastError() 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char* pMsg; 5128eecc9f 2011-02-23 kinaba: ::FormatMessage( 5128eecc9f 2011-02-23 kinaba: FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 5128eecc9f 2011-02-23 kinaba: NULL,::GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&pMsg,0,NULL ); 5128eecc9f 2011-02-23 kinaba: app()->msgBox( pMsg ); 5128eecc9f 2011-02-23 kinaba: ::LocalFree( pMsg ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiSUtil::createShortCut( const kiPath& at, const char* name ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: ::CoInitialize(NULL); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: IShellLink* psl; 5128eecc9f 2011-02-23 kinaba: if( SUCCEEDED(::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl)) ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: psl->SetPath( kiPath(kiPath::Exe_name) ); 5128eecc9f 2011-02-23 kinaba: psl->SetWorkingDirectory( kiPath(kiPath::Exe,false) ); 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: IPersistFile* ppf; 5128eecc9f 2011-02-23 kinaba: if( SUCCEEDED(psl->QueryInterface(IID_IPersistFile,(void**)&ppf)) ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: WORD wsz[MAX_PATH]; 5128eecc9f 2011-02-23 kinaba: kiPath lnkfile( at ); 5128eecc9f 2011-02-23 kinaba: lnkfile += name, lnkfile += ".lnk"; 5128eecc9f 2011-02-23 kinaba: ::MultiByteToWideChar(CP_ACP,0,lnkfile,-1,wsz,MAX_PATH); 5128eecc9f 2011-02-23 kinaba: ppf->Save(wsz,TRUE); 5128eecc9f 2011-02-23 kinaba: ppf->Release(); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: psl->Release(); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: ::CoUninitialize(); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: bool kiSUtil::exist( const char* fname ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: return 0xffffffff != ::GetFileAttributes( fname ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: bool kiSUtil::isdir( const char* fname ) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: DWORD attr = ::GetFileAttributes( fname ); 5128eecc9f 2011-02-23 kinaba: return attr!=0xffffffff && (attr&FILE_ATTRIBUTE_DIRECTORY); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: // 挿入caldixF 5128eecc9f 2011-02-23 kinaba: // ファイル参照ダイアログ手抜き版 5128eecc9f 2011-02-23 kinaba: bool kiSUtil::getOpenFileNameDlg(HWND hwnd,char *rfn) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: OPENFILENAME ofn; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: ZeroMemory((LPVOID)&ofn, sizeof(OPENFILENAME)); 5128eecc9f 2011-02-23 kinaba: ofn.lStructSize = sizeof(OPENFILENAME); 5128eecc9f 2011-02-23 kinaba: ofn.hwndOwner = hwnd; 5128eecc9f 2011-02-23 kinaba: ofn.lpstrFilter = "アプリケーション(*.exe)\0*.exe\0全てのファイル(*.*)\0*.*\0\0"; 5128eecc9f 2011-02-23 kinaba: ofn.lpstrFile = rfn; 5128eecc9f 2011-02-23 kinaba: ofn.nMaxFile = MAX_PATH; 5128eecc9f 2011-02-23 kinaba: ofn.Flags = OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_EXPLORER; 5128eecc9f 2011-02-23 kinaba: ofn.lpfnHook = NULL; 5128eecc9f 2011-02-23 kinaba: // なんか持ってれば 5128eecc9f 2011-02-23 kinaba: if (GetOpenFileName(&ofn)){ 5128eecc9f 2011-02-23 kinaba: lstrcpy(rfn,ofn.lpstrFile); 5128eecc9f 2011-02-23 kinaba: return TRUE; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: return FALSE; 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: void kiSUtil::getOpenFileNameDlgOfEditBox(HWND wnd,HWND par) 5128eecc9f 2011-02-23 kinaba: { 5128eecc9f 2011-02-23 kinaba: char str[MAX_PATH]; 5128eecc9f 2011-02-23 kinaba: 5128eecc9f 2011-02-23 kinaba: str[0] = '\0'; 5128eecc9f 2011-02-23 kinaba: ::SendMessage( wnd, WM_GETTEXT, MAX_PATH, (LPARAM)str ); 5128eecc9f 2011-02-23 kinaba: if( getOpenFileNameDlg(par,str) ) 5128eecc9f 2011-02-23 kinaba: ::SendMessage( wnd, WM_SETTEXT, 0, (LPARAM)str ); 5128eecc9f 2011-02-23 kinaba: } 5128eecc9f 2011-02-23 kinaba: // 挿入ここまでcaldixF