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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0919
onionリストビューへのクリックによるアイテム選択を禁止するには?9解決


onion

リンク

2010/9/19(Sun) 15:03:53|NO.35051

こんにちは、お世話になります。
WinXP+HSP3.21で開発しています。

単一行選択のリストビューへの
マウスクリックによるアイテム選択を禁止したいのですが、うまくいきません。
プログラムからだけは、行をハイライト選択できるようにしたいため
LVN_ITEMCHANGINGやLVN_ITEMCHANGEDで一律に禁止してしまうのは避けています。
WM_NOTIFY内でのNM_CLICKやNM_RCLICKで、リストビューへのクリックの検出は出来るのですが
リストビューの行が選択されないように抑制する方法が分かりません。

objenableやEnableWindow()でリストビューを無効化させると
選択行がハイライトされなくなる(プログラムから選択できない)ため、
他の手段を探しています。

onclickやWM_LBUTTONDOWNなども試してみたのですが、うまくいきませんでした。
リストビューは有効にしたまま、プログラム以外からは操作できないように
したいと思っております。
取り急ぎマウスクリックでの禁止のみ質問させて頂きました、よろしくお願いします。



この記事に返信する


backdrop

リンク

2010/9/19(Sun) 22:44:58|NO.35059

質問させていただきます。
リストビューを使う目的は何なのか、行選択だったら別に
リストビュー使わなくても別の手段があるだろうに、というところはっきりさせてくださいお願いします
それと、かなりひねらないとその一律禁止というものはつきもの?



onion

リンク

2010/9/20(Mon) 18:16:17|NO.35065

チャットの参加者リストとして、
できればリストビューをグレーアウトさせないまま使えたらと思いました。
選択状態も利用したいと思っていましたが、
簡単にはできそうになければ、グレーアウトも含め他の方法で代用を考えようと思います。

こんな方法でもリストビュー有効のまま実現できそうというやり方があったら、
引き続きお返事を待ちたいと思います。



u

リンク

2010/9/20(Mon) 21:51:38|NO.35072

挙動そのものを変えるには恐らくDLLが必要になると思います。

>リストビュー使わなくても別の手段があるだろうに、というところはっきりさせてくださいお願いします
質問から察するに見た目や手軽さの為なるべくリストビューで実現させたくて質問したのではないでしょうか。



gagreag

リンク

2010/9/20(Mon) 21:52:51|NO.35073

オニオンの名を語るにはまだ早いんじゃないのか?

で表題と内容があってますか?

>マウスクリックによるアイテム選択を禁止したいのですが
>リストビューをグレーアウトさせないまま使えたらと思いました。

グレーアウトって何ですか?
エクスプローラを2つ起動して片方のアイテムを選択して別窓へ移ると
グレーで選択項目が塗られることですか?

アイテムを選択させないのと、グレー表示させたくない(有効状態を維持したい)
とは真逆のような気がしますが。


ユーザーが項目を選択できる機能だけを排除したいということですか?

WM_NOTIFYで処理できませんか?
リストビューはユーザーのクリックを処理したあと、クリックした座標から塗りつぶす項目を判断して塗りつぶしているはずです。
メッセージの戻り値を正しく指定してますか?
大抵のメッセージは0を返すから0にしておけばいいやと思ってませんか?
戻り値によってその後のメッセージのリレーは変わります。

まだ挙動を示せるサンプル(自分で動作確認するためのものという意味での)を書いていませんが、
調べればあなたの望む動作を実装できる自信はあります。



gagreag

リンク

2010/9/20(Mon) 21:57:33|NO.35074

あーなんかヒント言っちゃったっぽい。



木村

リンク

2010/9/21(Tue) 12:05:11|NO.35082

 雅やかさに欠ける方法ですけど、透明なウィンドウを作りディスプレイの最上位に置く事で
結果的にオブジェクトへのマウスクリックを阻害すると言う手もあります。以下は一例ですが
リストビューを作るのが面倒だったのでリストボックスで代用しています。


//シールを貼ってクリックを無効化する(No.4806の名無し様のソースを参照) //終了はALT+F4で #include "user32.as" #define MAIN_WINDOW 0 #define SEAL_WINDOW 1 #define SEAL_SX 120 #define SEAL_SY 90 #define SEAL_PX 240 #define SEAL_PY 180 #define SEAL_DISPX wx+SEAL_PX+3 #define SEAL_DISPY wy+SEAL_PY+27 #define SET_WX gsel MAIN_WINDOW : wx = ginfo_wx1 #define SET_WY gsel MAIN_WINDOW : wy = ginfo_wy1 screen MAIN_WINDOW, 640, 480, 0 objsize SEAL_SX, SEAL_SY pos SEAL_PX, SEAL_PY listbox list, 0, "ウツボット\nサボネア\nマスキッパ\n次は誰だろ?\nひゃっはー" SET_WX SET_WY bgscr SEAL_WINDOW, SEAL_SX, SEAL_SY, 0, SEAL_DISPX, SEAL_DISPY gsel SEAL_WINDOW, 2 color 192, 255, 224 boxf GetWindowLong hwnd,-20 SetWindowLong hwnd,-20,stat|$80000 SetLayeredWindowAttributes hwnd,0xffffff,128,3 *前口上は変わっても、吹っ飛び捨て台詞は変わらない pre_wx = wx pre_wy = wy SET_WX SET_WY if (pre_wx ! wx) | (pre_wy ! wy) { gsel SEAL_WINDOW width , , SEAL_DISPX, SEAL_DISPY } wait 17 goto *前口上は変わっても、吹っ飛び捨て台詞は変わらない



onion

リンク

2010/9/21(Tue) 21:36:28|NO.35092

uさん、gagreagさん、木村さん
書き込みありがとうございます。

誤解を与えてしまい申し訳ありません、
「ユーザーが項目を選択できる機能だけを排除したい」ということで質問しました。
gagreagさんからのヒント、参考にしてみようと思います。

木村さんのサンプルにあるシールウィンドウという考え方もあるのですね、
大変参考になりました。

解決としたいと思いますが
もし、今後も「こんな方法もあった」と回答してくださる方がいらっしゃったら
書き込みしていただけるとありがたいです。



gagreag

リンク

2010/9/22(Wed) 03:03:34|NO.35101

>もし、今後も「こんな方法もあった」と回答してくださる方がいらっしゃったら
あなたが今実装できる方法で実装してください。

最初から最適な実装・コーディングを何の知識もなしに求めようとするのは贅沢なのでは?



SYAM

リンク

2010/9/22(Wed) 14:57:54|NO.35103

処理の実装の仕方とかならまだしも、
Windowsの機能 のつかいかた …に関しては、方法そのままを聞くしかないケースも多々あります。

機能があるもんなら、それを使えばよいことです。
なければ、たしかに 今実装できる方法で実装で なんとかするしかないですが。



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