//-------------------------------------------------------------------------------- // //【フォルダ選択ダイアログの実装】 // #include "winnetwk.h" #include "shlobj.h" //(SDK/MFC) ///////////////////////////////////////////////////////////////////////////// void OnTest(HWND hWnd) { char szFolder[MAX_PATH] ; if(GetOpenFolderName(hWnd, "c:\\", szFolder, MAX_PATH) == IDOK){ MessageBox(hWnd, szFolder, "選択されたフォルダ", MB_OK) ; } } ///////////////////////////////////////////////////////////////////////////// // フォルダ選択ダイアログの起動 UINT GetOpenFolderName(HWND hWnd, LPCTSTR lpszDefaultFolder, LPTSTR lpszBuffer, DWORD dwBufferSize) { BROWSEINFO bi ; ITEMIDLIST* pidl ; char szSelectedFolder[MAX_PATH] ; ZeroMemory(&bi, sizeof(BROWSEINFO)) ; bi.hwndOwner = hWnd ; // コールバック関数を指定 bi.lpfn = SHBrowseProc ; // デフォルトで選択させておくフォルダを指定 bi.lParam = (LPARAM)lpszDefaultFolder ; // タイトルの指定 bi.lpszTitle = "フォルダを選択してください" ; // フォルダダイアログの起動 pidl = SHBrowseForFolder(&bi) ; if(pidl){ // 選択されたフォルダ名を取得 SHGetPathFromIDList(pidl, szSelectedFolder) ; _SHFree(pidl) ; if((DWORD)lstrlen(szSelectedFolder) < dwBufferSize) lstrcpy(lpszBuffer, szSelectedFolder) ; // フォルダが選択された return IDOK ; } // フォルダは選択されなかった return IDCANCEL ; } ///////////////////////////////////////////////////////////////////////////// // SHBrowseForFolder()用コールバック関数 int CALLBACK SHBrowseProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) { if(uMsg == BFFM_INITIALIZED && lpData){ // デフォルトで選択させるパスの指定 SendMessage(hWnd, BFFM_SETSELECTION, TRUE, lpData) ; } return 0 ; } //(SDK) ///////////////////////////////////////////////////////////////////////////// // システムが確保したITEMIDLISTを開放しなければならない void _SHFree(ITEMIDLIST* pidl) { IMalloc *pMalloc ; SHGetMalloc(&pMalloc) ; if(pMalloc){ pMalloc->lpVtbl->Free(pm,pidl) ; pMalloc->lpVtbl->Release(pm) ; } } //(MFC) ///////////////////////////////////////////////////////////////////////////// // システムが確保したITEMIDLISTを開放しなければならない void _SHFree(ITEMIDLIST* pidl) { IMalloc* pMalloc ; SHGetMalloc(&pMalloc) ; if(pMalloc){ pMalloc->Free(pidl) ; pMalloc->Release() ; } }
//-------------------------------------------------------------------------------- // //【フォーマットダイアログの出し方】 // //(SDK/MFC) ///////////////////////////////////////////////////////////////////////////// // GetProcAddress()用の関数型宣言 typedef DWORD(FAR PASCAL *SHFORMATDRIVE)(HWND hWnd, UINT drive, UINT fmtID, UINT options) ; ///////////////////////////////////////////////////////////////////////////// void DoFormatDialog(HWND hWnd, int nDriveNum, int nFormatMode) { SHFORMATDRIVE func_SHFormatDrive ; HINSTANCE hinstDll = LoadLibrary("Shell32.DLL") ; func_SHFormatDrive = (SHFORMATDRIVE)GetProcAddress(hinstDll, "SHFormatDrive") ; func_SHFormatDrive(hWnd, // フォーマットダイアログの親ウィンドウハンドル nDriveNum, // A=0, B=1,... 0xffff, // SHFMT_ID_DEFAULT nFormatMode) ; // nFormatModeの値(95の時) |(NT4.0の時) // 0 = クイックフォーマット |0 = 通常フォーマット // 1 = 通常フォーマット |1 = クイックフォーマット // 2 = 起動専用 | // DLLを開放 FreeLibrary(hinstDll) ; }
//-------------------------------------------------------------------------------- // //【コモンダイアログの表示位置変更】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// void OnTest(HWND hWnd) { OPENFILENAME ofn ; char szFileName[MAX_PATH] ; szFileName[0] = '\0' ; ZeroMemory((LPVOID)&ofn, sizeof(OPENFILENAME)) ; ofn.lStructSize = sizeof(OPENFILENAME) ; ofn.hwndOwner = hWnd ; ofn.lpstrFilter = "全てのファイル(*.*)\0*.*\0\0" ; ofn.lpstrFileTitle = szFileName ; ofn.nMaxFileTitle = MAX_PATH ; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_ENABLEHOOK ; ofn.lpfnHook = OFNHookProc ; // ファイルダイアログの起動 GetOpenFileName(&ofn) ; } ///////////////////////////////////////////////////////////////////////////// // ファイルダイアログ用コールバック関数 UINT CALLBACK OFNHookProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_NOTIFY : OFNOTIFY* lpof = (OFNOTIFY*)lParam ; if(lpof->hdr.code == CDN_SELCHANGE){ // ファイルが選択される度にダイアログが右へ移動する RECT rcWindow ; GetWindowRect(GetParent(hDlg), &rcWindow) ; SetWindowPos(GetParent(hDlg), HWND_TOP, rcWindow.left+10, rcWindow.top, -1, -1, SWP_NOSIZE) ; return TRUE ; } break ; default : break ; } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// void CTestWnd::OnTest() { CTestFileDialog dlg(TRUE, "", "", OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, "全てのファイル(*.*)|*.*||", this) ; // ファイルダイアログの起動 dlg.DoModal() ; } ///////////////////////////////////////////////////////////////////////////// // CTestFileDialogはCFileDialogの派生クラス // 手動で追加したOnNotify()関数 BOOL CTestFileDialog::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { OFNOTIFY* lpof = (OFNOTIFY*)lParam ; if(lpof->hdr.code == CDN_SELCHANGE){ // ファイルが選択される度にダイアログが右へ移動する CRect rcWindow ; GetParent()->GetWindowRect(rcWindow) ; GetParent()->SetWindowPos(&wndTop, rcWindow.left+10, rcWindow.top, -1, -1, SWP_NOSIZE) ; } *pResult = 0 ; return TRUE ; }
//-------------------------------------------------------------------------------- // //【ファイルダイアログのOKボタン名変更】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// // ファイルダイアログ用コールバック関数 UINT CALLBACK OFNHookProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message){ case WM_INITDIALOG : CommDlg_OpenSave_SetControlText(GetParent(hDlg), IDOK, "このファイルを開く") ; return TRUE ; default : break ; } return FALSE ; } //(MFC) ///////////////////////////////////////////////////////////////////////////// // CTestFileDialogはCFileDialogの派生クラス BOOL CTestFileDialog::OnInitDialog() { CFileDialog::OnInitDialog() ; CommDlg_OpenSave_SetControlText(GetParent()->m_hWnd, IDOK, "このファイルを開く") ; return TRUE ; }
-------------------------------------------------------------------------------- // //【ファイルダイアログで複数選択の結果取得】 // //(SDK) ///////////////////////////////////////////////////////////////////////////// void OnTest(HWND hWnd) { OPENFILENAME ofn ; char szPathName[MAX_PATH] ; char szFolder[MAX_PATH] ; char szFileNameBuffer[100000] ; ZeroMemory((LPVOID)&ofn, sizeof(OPENFILENAME)) ; ofn.lStructSize = sizeof(OPENFILENAME) ; ofn.hwndOwner = hWnd ; ofn.lpstrFilter = "全てのファイル(*.*)\0*.*\0\0" ; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_EXPLORER | OFN_ALLOWMULTISELECT ; ofn.lpstrFile = szFileNameBuffer ; ofn.nMaxFile = 100000 ; if(GetOpenFileName(&ofn) == TRUE){ char szBuffer[512] ; LPTSTR lpEnd = strchr(szFileNameBuffer, '\0') ; LPTSTR lpszNextString = lpEnd + 1 ; if(lpEnd){ if(*(lpszNextString) == '\0'){ // ファイルが1つしか選択されていない lstrcpy(szBuffer, szFileNameBuffer) ; } else{ // ファイルが複数選択されている int nLength; // フォルダ名の取得 lstrcpy(szFolder, szFileNameBuffer) ; nLength = lstrlen(szFolder) ; // 「\」記号で終わっていなければ付加 if(szFolder[nLength] != '\\') lstrcat(szFolder, "\\") ; szBuffer[0] = '\0' ; while(*(lpszNextString) != '\0'){ // 選択されたファイルのパス名を作成 lstrcpy(szPathName, szFolder) ; lstrcat(szPathName, lpszNextString) ; // 確認用のデータ作成 lstrcat(szBuffer, szPathName) ; lstrcat(szBuffer, "\n") ; // 次のファイル名を探す lpEnd = strchr(lpszNextString, '\0') ; lpszNextString = lpEnd + 1 ; } } MessageBox(hWnd, szBuffer, "205選択されたファイル", MB_OK) ; } } } //(MFC) ///////////////////////////////////////////////////////////////////////////// void CTestWnd::OnTest() { CString strPathName ; CFileDialog dlg(TRUE, "", "", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT, "全てのファイル(*.*)|*.*||", this) ; char szFileNameBuffer[100000] ; // この3行は複数のファイルを1度に dlg.m_ofn.lpstrFile = szFileNameBuffer ; // 選択して開けるようにするためのもの dlg.m_ofn.nMaxFile = 100000 ; // dlg.m_ofn.lpstrTitle = "205ファイルダイアログで複数選択の結果取得" ; if(dlg.DoModal()==IDOK){ POSITION pos = dlg.GetStartPosition() ; while(pos){ // ファイル名の取得 strPathName += dlg.GetNextPathName(pos) ; strPathName += "\n" ; } MessageBox(strPathName, "205選択されたファイル") ; } }
//-------------------------------------------------------------------------------- // //【ダイアログでEnter・Escを無効にする】 // //(MFC) ///////////////////////////////////////////////////////////////////////////// // クラスウィザードによって追加された関数 BOOL CTestDialog::PreTranslateMessage(MSG* pMsg) { if(pMsg->message == WM_KEYDOWN){ switch(pMsg->wParam){ case VK_RETURN : // Enterキー押下 // 独自の処理 // デフォルトの動作をさせたくない時はTRUEを返す return TRUE ; case VK_ESCAPE : // Escキー押下 // 独自の処理 return TRUE ; default : break ; } } return CDialog::PreTranslateMessage(pMsg) ; }
//-------------------------------------------------------------------------------- // //【ダイアログにツールチップをつける】 // //1. ダイアログのメンバ変数にツールチップコントロールを追加する CToolTipCtrl m_ToolTip ; //2. OnInitDialog()をオーバーライドする // ツールヒントコントロールを作成 m_ToolTip.Create(this) ; // ツールヒントコントロールを OKボタンに結び付ける m_ToolTip.AddTool((CButton *)GetDlgItem(IDOK), _T("This is OK button")) ; //3. PreTranslateMessage()をオーバーライドする { switch(pMsg->message){ case WM_LBUTTONDOWN: case WM_LBUTTONUP: case WM_MOUSEMOVE: // マウス メッセージをツール ヒント コントロールに渡して処理する m_ToolTip.RelayEvent(pMsg) ; } return CDialog::PreTranslateMessage(pMsg) ; }