舌のようなコントロールは一体・・・

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 舌のようなコントロールは一体・・・

ありがとうございました

by ケースケ » 2005年12月02日(金) 01:15

できました。
ありがとうございました。

今後ともよろしくお願いします。

by イグトランス » 2005年11月28日(月) 21:39

失礼いたしました。
SHAutoCompleteをpfnSHAutoCompleteにしてください。

元のコードも修正しておきました。

by ケースケ » 2005年11月28日(月) 13:41

ありがとうございます。けど、すみません。
うまく動きません。

"SHAutoComplete" 無効な識別子です

と怒られてしまいます。

とりあえず動く事を確認してからいろいろ実験しようと思ったのですが、実行できませんでした。

すみませんが、再度お願いします。

by イグトランス » 2005年11月25日(金) 18:09

 それはきっとオートコンプリートのことだと思います。
ファイルとフォルダのパスや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
 さてCoInitialize関数を呼んだらプログラム(正確にはスレッド)の終了時にはCoUninitialize関数を呼ばなくてはなりません。
通常は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: この位置にグローバルな変数、構造体、定数、関数を定義します。」のあたりにでも置いてください。

by ケースケ » 2005年11月25日(金) 09:45

遅くなってすみません。

「舌のような」とは、たとえばIEのアドレスバーに「h」と打つと「http://~」の履歴が下に表示されますよね。
あの動作をやりたいのです。

実際にやってみると、リストに文字列を追加してもリストを開くことが出来ません。(開けますが、エディットボックスからフォーカスが消えてしまいます)

よく見たらIEはリストを表示中も右端の「▼」ボタンが押されていないので、もしかしたら別のコントロールを表示しているのかな? などと思っているのですが・・・
どうなのでしょうか? よろしくお願いします。

Re: 舌のようなコントロールは一体・・・

by 淡幻星 » 2005年11月22日(火) 14:43

“舌”のようなコントロール!?って注目しちゃいました(笑)
> ドロップダウン関連
というののが、どのあたりを疑問として指しているのか分からないんですが、
ドロップダウンは、コンボボックスで実装できます。
RADを使っているなら、
コンボボックス→タイプ「ドロップダウン」でできると思います。
(Ver2.6でRAD無しでしかテストしたことありませんので未確認^^;)

CreateWindowEx()でやるなら、
COMBOBOXクラスのスタイルはCBS_DROPDOWNで・・・
って、このへんは「コンボボックス」で検索すれば、
解説ページがたくさん出来てきますね、きっと^^;

参考までに、ドロップダウンで表示されるリストへの項目追加は
下部のリストに項目を追加するには CB_ADDSTRING を使います
WPARAM は 0 を、LPARAM は追加する項目の文字列へのポインタを指定します
戻り値は、追加された項目の位置です
で出来ます。

舌のようなコントロールは一体・・・

by ケースケ » 2005年11月22日(火) 11:33

久しぶりにお世話になります。

ファイルを開くダイアログなどで、ファイル名の欄に文字を打つとズルッとドロップダウンのようなリストが開いてフォルダ内のファイル名を選べますよね。
あのコントロールはどうやれば実装できるのでしょうか?
ドロップダウン関連だと思うのです。が、エディットボックス欄にフォーカスがありながらカーソルキーの上下でリストの内容を選べるので、もしかしたら別々の2つのコントロールなのだろうか? などといろいろやっていますがうまくいきません。

あのコントロールの正体を教えていただけないでしょうか? お願いします。

ページトップ