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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
ケースケ
記事: 45
登録日時: 2005年5月31日(火) 23:46
お住まい: 愛知県
連絡する:

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

#1 投稿記事 by ケースケ »

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

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

あのコントロールの正体を教えていただけないでしょうか? お願いします。
淡幻星
記事: 183
登録日時: 2005年7月19日(火) 07:02
お住まい: 宮城県
連絡する:

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

#2 投稿記事 by 淡幻星 »

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

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

参考までに、ドロップダウンで表示されるリストへの項目追加は
下部のリストに項目を追加するには CB_ADDSTRING を使います
WPARAM は 0 を、LPARAM は追加する項目の文字列へのポインタを指定します
戻り値は、追加された項目の位置です
で出来ます。
ケースケ
記事: 45
登録日時: 2005年5月31日(火) 23:46
お住まい: 愛知県
連絡する:

#3 投稿記事 by ケースケ »

遅くなってすみません。

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

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

よく見たらIEはリストを表示中も右端の「▼」ボタンが押されていないので、もしかしたら別のコントロールを表示しているのかな? などと思っているのですが・・・
どうなのでしょうか? よろしくお願いします。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#4 投稿記事 by イグトランス »

 それはきっとオートコンプリートのことだと思います。
ファイルとフォルダのパスや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: この位置にグローバルな変数、構造体、定数、関数を定義します。」のあたりにでも置いてください。
最後に編集したユーザー イグトランス [ 2005年11月28日(月) 21:37 ], 累計 1 回
ケースケ
記事: 45
登録日時: 2005年5月31日(火) 23:46
お住まい: 愛知県
連絡する:

#5 投稿記事 by ケースケ »

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

"SHAutoComplete" 無効な識別子です

と怒られてしまいます。

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

すみませんが、再度お願いします。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#6 投稿記事 by イグトランス »

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

元のコードも修正しておきました。
ケースケ
記事: 45
登録日時: 2005年5月31日(火) 23:46
お住まい: 愛知県
連絡する:

ありがとうございました

#7 投稿記事 by ケースケ »

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

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