久しぶりにお世話になります。
ファイルを開くダイアログなどで、ファイル名の欄に文字を打つとズルッとドロップダウンのようなリストが開いてフォルダ内のファイル名を選べますよね。
あのコントロールはどうやれば実装できるのでしょうか?
ドロップダウン関連だと思うのです。が、エディットボックス欄にフォーカスがありながらカーソルキーの上下でリストの内容を選べるので、もしかしたら別々の2つのコントロールなのだろうか? などといろいろやっていますがうまくいきません。
あのコントロールの正体を教えていただけないでしょうか? お願いします。
舌のようなコントロールは一体・・・
Re: 舌のようなコントロールは一体・・・
“舌”のようなコントロール!?って注目しちゃいました(笑)
ドロップダウンは、コンボボックスで実装できます。
RADを使っているなら、
コンボボックス→タイプ「ドロップダウン」でできると思います。
(Ver2.6でRAD無しでしかテストしたことありませんので未確認^^;)
CreateWindowEx()でやるなら、
COMBOBOXクラスのスタイルはCBS_DROPDOWNで・・・
って、このへんは「コンボボックス」で検索すれば、
解説ページがたくさん出来てきますね、きっと^^;
参考までに、ドロップダウンで表示されるリストへの項目追加は
というののが、どのあたりを疑問として指しているのか分からないんですが、> ドロップダウン関連
ドロップダウンは、コンボボックスで実装できます。
RADを使っているなら、
コンボボックス→タイプ「ドロップダウン」でできると思います。
(Ver2.6でRAD無しでしかテストしたことありませんので未確認^^;)
CreateWindowEx()でやるなら、
COMBOBOXクラスのスタイルはCBS_DROPDOWNで・・・
って、このへんは「コンボボックス」で検索すれば、
解説ページがたくさん出来てきますね、きっと^^;
参考までに、ドロップダウンで表示されるリストへの項目追加は
で出来ます。下部のリストに項目を追加するには CB_ADDSTRING を使います
WPARAM は 0 を、LPARAM は追加する項目の文字列へのポインタを指定します
戻り値は、追加された項目の位置です
それはきっとオートコンプリートのことだと思います。
ファイルとフォルダのパスやURLをオートコンプリートで表示させたいのなら,
お手軽なことにその名もずばりSHAutoComplete関数を呼ぶだけでできます。(ただし要IE5以上ですが)
オートコンプリートはエディットコントロールに対して機能するので,まずはRADでウィンドウ内にエディットコントロールを置いてください。
(以下MainWnd上にIDをEditBox1にして設置したとして話を進めます)
そうしたらCreateイベント内で次のようにSHAutoComplete関数を呼びます。(IE5以上がない環境でも動くように動的リンクしています)
さてCoInitialize関数を呼んだらプログラム(正確にはスレッド)の終了時にはCoUninitialize関数を呼ばなくてはなりません。
通常はDestroyイベントで呼べばいいのですが,今回はそうも行きません。
なぜならSHAutoCompleteを呼んだあとにCoUninitializeを呼ぶのは,
対象となったエディットコントロールが破棄された(WM_DESTROYが呼ばれた)後でないといけないとなっているからです。
Destroyイベントではまだ子ウィンドウは生きています。つまり破棄されていません。
そこでどうするかというとWM_NCDESTROYメッセージを使います。
これは子ウィンドウが破棄されて本当の最後に呼ばれるメッセージです。
というわけでMainWndProcを次のように書き換えます。
最後に今回使う宣言類です。
「TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。」のあたりにでも置いてください。
ファイルとフォルダのパスやURLをオートコンプリートで表示させたいのなら,
お手軽なことにその名もずばりSHAutoComplete関数を呼ぶだけでできます。(ただし要IE5以上ですが)
オートコンプリートはエディットコントロールに対して機能するので,まずはRADでウィンドウ内にエディットコントロールを置いてください。
(以下MainWnd上にIDをEditBox1にして設置したとして話を進めます)
そうしたらCreateイベント内で次のようにSHAutoComplete関数を呼びます。(IE5以上がない環境でも動くように動的リンクしています)
コード: 全て選択
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
If SUCCEEDED(CoInitialize(0)) Then
Dim hinstShLwApi As HINSTANCE
hinstShLwApi = LoadLibrary("shlwapi.dll") As HINSTANCE
If hinstShLwApi <> 0 Then
Dim pfnSHAutoComplete As SHAutoComplete_Type
pfnSHAutoComplete = GetProcAddress(hinstShLwApi, "SHAutoComplete") As SHAutoComplete_Type
If pfnSHAutoComplete <> 0 Then
pfnSHAutoComplete(GetDlgItem(hMainWnd, EditBox1), SHACF_DEFAULT)
End If
End If
FreeLibrary(hinstShLwApi As HINSTANCE)
End If
End Sub
通常はDestroyイベントで呼べばいいのですが,今回はそうも行きません。
なぜならSHAutoCompleteを呼んだあとにCoUninitializeを呼ぶのは,
対象となったエディットコントロールが破棄された(WM_DESTROYが呼ばれた)後でないといけないとなっているからです。
Destroyイベントではまだ子ウィンドウは生きています。つまり破棄されていません。
そこでどうするかというとWM_NCDESTROYメッセージを使います。
これは子ウィンドウが破棄されて本当の最後に呼ばれるメッセージです。
というわけでMainWndProcを次のように書き換えます。
コード: 全て選択
Function MainWndProc(hWnd As HWND, dwMsg As DWord, wParam As WPARAM, lParam As LPARAM) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Select Case dwMsg
Case WM_NCDESTROY
CoUninitialize()
Case Else
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Select
End Function
「TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。」のあたりにでも置いてください。
[ここをクリックすると内容が表示されます]
コード: 全て選択
TypeDef HRESULT = Long
Const SUCCEEDED(hrStatus) = (hrStatus As HRESULT >= 0)
Const SHACF_DEFAULT = &h00000000
Const SHACF_FILESYSTEM = &h00000001
Const SHACF_URLHISTORY = &h00000002
Const SHACF_URLMRU = &h00000004
Const SHACF_USETAB = &h00000008
Const SHACF_FILESYS_ONLY = &h00000010
Const SHACF_URLALL = SHACF_URLHISTORY Or SHACF_URLMRU
Const SHACF_AUTOSUGGEST_FORCE_ON = &h10000000
Const SHACF_AUTOSUGGEST_FORCE_OFF = &h20000000
Const SHACF_AUTOAPPEND_FORCE_ON = &h40000000
Const SHACF_AUTOAPPEND_FORCE_OFF = &h80000000
TypeDef SHAutoComplete_Type = *Function(hwndEdit As HWND, dwFlags As DWORD) As HRESULT
最後に編集したユーザー イグトランス [ 2005年11月28日(月) 21:37 ], 累計 1 回
ありがとうございました
できました。
ありがとうございました。
今後ともよろしくお願いします。
ありがとうございました。
今後ともよろしくお願いします。