HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0430
floryLVN_ITEMACTIVATE2解決


flory

リンク

2008/4/30(Wed) 20:15:44|NO.15535

興味本位からリストビューについていろいろ調べていたところ、リストビュー固有の拡張スタイルに
「アイテムをクリックしたとき、親ウィンドウにLVN_ITEMACTIVATE通知メッセージが送られるようにする」
という、LVS_EX_ONECLICKACTIVATEスタイルなるものがあった(参考:ちょくとのページ)。ところが、
調べてみても、LVN_ITEMACTIVATEのメッセージコードがわからない。そこで自分で検証し、コードは
-114だろうと推測した。
実際に下のスクリプトを動かすと、期待した通りの動作(アイテムをクリックすると"Clicked!"と表示)
をしてくれる。

#define WS_VISIBLE $10000000 ;可視状態のウィンドウ #define WS_CHILD $40000000 ;子ウィンドウ #define WS_BORDER $00800000 ;境界線を持つウィンドウ #define LVS_REPORT $00000001 ;詳細表示リストビュー #define LVS_EX_ONECLICKACTIVATE $00000040 ;アイテムクリックでLVN_ITEMACTIVATE通知 #define LVS_EX_TWOCLICKACTIVATE $00000080 ;アイテムダブルクリックでLVN_ITEMACTIVATE通知 #define WM_NOTIFY $004E ;コモンコントロールからの通知 #define LVM_SETEXTENDEDLISTVIEWSTYLE $1036 ;拡張スタイル設定 #define LVM_INSERTCOLUMN $101B ;カラム挿入 #define LVM_INSERTITEM $1007 ;アイテム挿入 #define LVN_ITEMACTIVATE -114 #uselib "comctl32.dll" #func InitCommonControls "InitCommonControls" InitCommonControls ;コモンコントロール初期化 winobj "SysListView32", "", 0, WS_VISIBLE | WS_CHILD | WS_BORDER | LVS_REPORT, 200, 200 ;リストビュー設置 hList = objinfo(stat, 2) sendmsg hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_ONECLICKACTIVATE ;拡張スタイルを設定 szText = "カラム" lvcolumn = $F, 0, 100, varptr(szText), 0, 0 sendmsg hList, LVM_INSERTCOLUMN, 0, varptr(lvcolumn) ;カラム追加 repeat 7 szText = "アイテム" + cnt lvitem = $1, cnt, 0, 0, 0, varptr(szText) sendmsg hList, LVM_INSERTITEM, 0, varptr(lvitem) ;アイテム追加x7 loop oncmd gosub *activated, WM_NOTIFY ;oncmdを有効に stop *activated dupptr nmhdr, lparam, 12 if nmhdr.2 = LVN_ITEMACTIVATE : mes "Clicked!" ;NMHDR構造体からcodeメンバを取り出し、確認 return

さらに検証するため、今度はLVS_EX_TWOCLICKACTIVATEスタイルを設定してみた。上のスクリプトの20行目
を変えるだけでよい。これならば、アイテムをダブルクリックしたときにLVN_ITEMACTIVATEメッセージが
送られ、"Clicked!"と表示されるはずだ。
実際にスクリプトを動かしてみると、確かにダブルクリックしたときに"Clicked!"と表示される。これは
期待した通りである。しかし、幾度か試すうちに、ダブルクリックしていないにもかかわらず"Clicked"が
表示されることがあるのに気づく。どうやら、「すでに選択されているアイテムをクリックしたとき」
にLVN_ITEMACTIVATEメッセージが送られているようだ。つまり、厳密には「ダブルクリックしたとき」
にLVN_ITEMACTIVATEメッセージが送られるのではないわけだ。

検証の締めくくりに、拡張スタイルを設定せずにスクリプトを動かしてみた。上のスクリプトの20行目を
コメントアウトすればよい。これならば、LVN_ITEMACTIVATEメッセージが送られることはないはずだ。
実際にスクリプトを動かしてみると、確かにクリックしただけでは"Clicked!"は表示されない。しかし、
アイテムをダブルクリックしたときに"Clicked!"が表示されてしまった。

最後に、LVN_ITEMACTIVATE通知メッセージのコードが-114でない可能性であるが、LVS_EX_***CLICKACTIVATE
スタイルを設定しているときと設定していないときで挙動が変わっているため、おそらく-114で間違いない
と思われる。

以上から、

LVN_ITEMACTIVATE通知メッセージは…

メッセージコードは-114であり、

デフォルト→
アイテムをダブルクリックした場合に送られる。

LVS_EX_ONECLICKACTIVATEスタイル→
選択済みのアイテムをクリックしたときに送られる。

LVS_EX_TWOCLICKACTIVATEスタイル→
アイテムをクリックしたときに送られる。

と結論付ける。






これであってるかな?



この記事に返信する


Kpan

リンク

2008/4/30(Wed) 21:58:48|NO.15540

よく調べてないので分からんですが、自分は↓で受け取ってます。

単純な選択クリック LVN_ITEMCHANGED (マウス限定ならNM_CLICKなのかな?)
ダブルクリック NM_DBLCLK



flory

リンク

2008/4/30(Wed) 22:28:13|NO.15541

すいません、訂正です。

>以上から、
>
>LVN_ITEMACTIVATE通知メッセージは…
>
>メッセージコードは-114であり、
>
>デフォルト→
>アイテムをダブルクリックした場合に送られる。
>
>LVS_EX_ONECLICKACTIVATEスタイル→
>選択済みのアイテムをクリックしたときに送られる。
>
>LVS_EX_TWOCLICKACTIVATEスタイル→
>アイテムをクリックしたときに送られる。
>
>と結論付ける。

ここのLVS_EX_ONECLICKACTIVATEとLVS_EX_TWOCLICKACTIVATEが逆ですねorz
もっと確認してから投稿すべきだった。


>Kpanさん
これはあくまで興味本位で調べただけであって、実用性などは問題にしていません。
なんといっても「ひとりごと」ですし。
実用性から言えばLVN_ITEMCHANGEDなどのほうが良いというのは自分もそう思います。

あー、でも、LVN_ITEMACTIVATEなら、純粋に「アイテムが選択されたとき」に送られるので、
NM_CLICKやNM_DBLCLKの代わりに使うと余計な処理がいらなくなるかもです。



ONION software Copyright 1997-2023(c) All rights reserved.