ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 01:00

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年11月22日(火) 11:33 
オフライン

登録日時: 2005年5月31日(火) 23:46
記事: 45
お住まい: 愛知県
久しぶりにお世話になります。

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

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


通報する
ページトップ
投稿記事Posted: 2005年11月22日(火) 14:43 
オフライン

登録日時: 2005年7月19日(火) 07:02
記事: 183
お住まい: 宮城県
“舌”のようなコントロール!?って注目しちゃいました(笑)
引用:
> ドロップダウン関連
というののが、どのあたりを疑問として指しているのか分からないんですが、
ドロップダウンは、コンボボックスで実装できます。
RADを使っているなら、
コンボボックス→タイプ「ドロップダウン」でできると思います。
(Ver2.6でRAD無しでしかテストしたことありませんので未確認^^;)

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

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


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月25日(金) 09:45 
オフライン

登録日時: 2005年5月31日(火) 23:46
記事: 45
お住まい: 愛知県
遅くなってすみません。

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

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

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


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月25日(金) 18:09 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
 それはきっとオートコンプリートのことだと思います。
ファイルとフォルダのパスや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 回

通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月28日(月) 13:41 
オフライン

登録日時: 2005年5月31日(火) 23:46
記事: 45
お住まい: 愛知県
ありがとうございます。けど、すみません。
うまく動きません。

"SHAutoComplete" 無効な識別子です

と怒られてしまいます。

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

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


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月28日(月) 21:39 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
失礼いたしました。
SHAutoCompleteをpfnSHAutoCompleteにしてください。

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


通報する
ページトップ
投稿記事Posted: 2005年12月02日(金) 01:15 
オフライン

登録日時: 2005年5月31日(火) 23:46
記事: 45
お住まい: 愛知県
できました。
ありがとうございました。

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


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot] & ゲスト[19人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean