トップ回答者
SHBrowseForFolderでOKボタンをクリックした後、SHBrowseForFolderに戻る方法は?

質問
回答
-
戻り値が有効なのは BFFM_VALIDATEFAILED だけで、それ以外は 0 を返すものみたいですね。
オンラインの
BrowseCallbackProc Function ()
http://msdn.microsoft.com/en-us/library/bb762598.aspx
だと不思議と Return Value の説明が抜けているようですが、Visual Studio 2008 のドキュメントには、
Returns zero except in the case of BFFM_VALIDATEFAILED. For that flag, returns zero to dismiss the dialog or nonzero to keep the dialog displayed.
と書かれています。
BrowseCallbackProc Function
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.ja/shellcc/platform/shell/reference/callbackfunctions/browsecallbackproc.htm
その代わりといってはなんですが、無効なフォルダ名のときに BFFM_ENABLEOK を SendMessage して、
OK ボタンを Disable にするというのはいかがでしょうか?- 回答としてマーク 高橋 春樹 2009年6月10日 8:32
-
サブクラス化をすると、OK ボタンのクリックを捕まえられます。
BrowseCallbackProc の BFFM_INITIALIZED メッセージのときに、
SetWindowLong(hwnd, GWL_WNDPROC, (LONG)MyWndProc);
として、サブクラス化します。次に MyWndProc の方では、
long __stdcall MyWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_COMMAND: if(LOWORD(wParam) == IDOK) { // OK ボタンをキャンセルしたい場合は 0 を返します return 0; } break; } return DefDlgProc(hwnd, uMsg, wParam, lParam); }
などとしておけば、OK ボタンのクリックを捕まえられます。
ここで何らかのチェックを実行し、0 を返すと OK を取り消しできます。
すべての返信
-
戻り値が有効なのは BFFM_VALIDATEFAILED だけで、それ以外は 0 を返すものみたいですね。
オンラインの
BrowseCallbackProc Function ()
http://msdn.microsoft.com/en-us/library/bb762598.aspx
だと不思議と Return Value の説明が抜けているようですが、Visual Studio 2008 のドキュメントには、
Returns zero except in the case of BFFM_VALIDATEFAILED. For that flag, returns zero to dismiss the dialog or nonzero to keep the dialog displayed.
と書かれています。
BrowseCallbackProc Function
ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.ja/shellcc/platform/shell/reference/callbackfunctions/browsecallbackproc.htm
その代わりといってはなんですが、無効なフォルダ名のときに BFFM_ENABLEOK を SendMessage して、
OK ボタンを Disable にするというのはいかがでしょうか?- 回答としてマーク 高橋 春樹 2009年6月10日 8:32
-
totojoさん、回答ありがとうございました。
>その代わりといってはなんですが、無効なフォルダ名のときに BFFM_ENABLEOK を SendMessage して、
>OK ボタンを Disable にするというのはいかがでしょうか?
私もその後色々試してみて、上記の方法を発見しました。
ただ、上記の方法は、ツリーでフォルダを新規に作成した時とフォルダ選択を変更したときに有効で、
OKボタンを押してしまったら、ダイアログは終了してしまうので、
呼び出し側でチェック後、だめだったら、選択したフォルダをカレントに指定してダイアログを表示しなおす・・・
とかしないとだめなんでしょうね。
ご教授ありがとうございました。 -
サブクラス化をすると、OK ボタンのクリックを捕まえられます。
BrowseCallbackProc の BFFM_INITIALIZED メッセージのときに、
SetWindowLong(hwnd, GWL_WNDPROC, (LONG)MyWndProc);
として、サブクラス化します。次に MyWndProc の方では、
long __stdcall MyWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { switch(uMsg) { case WM_COMMAND: if(LOWORD(wParam) == IDOK) { // OK ボタンをキャンセルしたい場合は 0 を返します return 0; } break; } return DefDlgProc(hwnd, uMsg, wParam, lParam); }
などとしておけば、OK ボタンのクリックを捕まえられます。
ここで何らかのチェックを実行し、0 を返すと OK を取り消しできます。 -
こんにちは、フォーラムオペレータの高橋春樹です。
totojoさん、いつもお世話になっております。
アドバイス有難うございました。msdn.bambinoさん、はじめまして。
MSDNフォーラムのご利用ありがとうございます。totojoさんから、新たなアドバイスがあったと思うのですが、
試して頂けましたでしょうか?(^-^)totojoさんから頂いた情報を皆様と共有するために、
回答マークを付けさせてもらいました。
不適切な場合は、回答マークを削除することも可能です。今後ともMSDNフォーラムをよろしくお願いします。
マイクロソフト株式会社 フォーラム オペレータ 高橋春樹