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


HSPTV!掲示板


未解決 解決 停止 削除要請

2010
0822
アイルーボタン押下時等のダブルクリックの取得について6解決


アイルー

リンク

2010/8/22(Sun) 03:26:06|NO.34568

お世話になっております。
以前画像閲覧ソフト作成について、ご助言をいただいておりましたものです。
NO.33550
画像のサムネイル表示について http://hsp.tv/play/pforum.php?mode=all&num=33550 NO.33572 スライドショーについて http://hsp.tv/play/pforum.php?mode=all&num=33572 NO.34023 onexit命令を使用した、ボタン押下時のウィンドウ非表示について。 http://hsp.tv/play/pforum.php?mode=all&num=34023 NO.34024 btnimgで画像ボタンが表示されません http://hsp.tv/play/pforum.php?mode=all&num=34024 NO.33964 一時停止・再生ボタンについて http://hsp.tv/play/pforum.php?mode=all&num=33964

皆様のご助言・ご助力のお陰で、何とか動けるものが作成できましたが、
ダブルクリック時の問題が発生し、またご助言を頂きに参りました。

自分自身はシングルクリックで動作確認を行っておりましたが、
ダブルクリックの処理等がすっかり抜けており、
ダブルクリックで画像を表示させることにより、不具合が起こることを確認致しました。

ダブルクリックの取得については、
http://hspdev-wiki.net/?%A5%C0%A5%D6%A5%EB%A5%AF%A5%EA%A5%C3%A5%AF%BC%E8%C6%C0
http://lhsp.s206.xrea.com/hsp_mouse.html(→マウスのクリックチェック)
を参考にしながら、自分のソース内で以下のように対応致しました。

#include "hspcv.as"
#include "scrlbar.hsp" #define WM_LBUTTONDOWN $0201 #define WM_LBUTTONDBLCLK $0203 #define WM_RBUTTONDOWN $0204 #define WM_RBUTTONDBLCLK $0206 #define WM_MBUTTONDOWN $0207 #define WM_MBUTTONDBLCLK $0209 // ダブルクリックを取得できるようウィンドウクラススタイル変更 (CS_DBLCLKS) GetClassLong hwnd, -26 SetClassLong hwnd, -26, stat | $8 oncmd gosub *lButtonDoubleClick, $0203 // WM_LBUTTONDBLCLK oncmd gosub *rButtonDoubleClick, $0206 // WM_RBUTTONDBLCLK /* トップページ */ *top /* 省略 */ /* ボタン押下により、「*titlelist」、「*slide」、「*thumbnail」のページへ遷移します */ /* タイトル一覧画面を表示 */ *titlelist /* 省略 */ /* listboxクリックにより、画像を別ウィンドウで表示します */ /* スライドショーを表示 */ *slide /* 省略 */ /* スライドショーを表示します。再生、一時停止、停止等をボタンで処理します */ /* サムネイル一覧画面を表示 */ *thumbnail /* 省略 */ /* 画像がサムネイル表示されており、サムネイルクリックにより、大きな画像を表示します */ /* プログラムの終了処理 */ *exit /* 省略 */ *lButtonDoubleClick *rButtonDoubleClick dialog "ダブルクリックは使用できません。\nシングルクリックで操作してください。" return

基本的に *top がID0、それ以外は ID3のウィンドウで動くようにしておりますが、
一応ウィンドウID0以外でも、ダブルクリックの判定は取れております。

しかし、判定が取れるのは、画面の何もない部分だけであり、
ボタン等をダブルクリックすると判定が取れず、
2回目のシングルクリックという形で、ボタンがクリックされてしまいます。

一番理想的なのは、ボタンとサムネイル画像を、
ダブルクリックにより処理できればいいのですが…
現在は、ボタンをダブルクリックすると、
シングルクリックの2回目ということで処理が流れます。
サムネイル画像をダブルクリックすると、
通常は大きな画像が表示されるのですが、画面が真っ白な状態で表示されてしまいます。

ダブルクリックでの処理がむずかしいようであれば、
ボタンやサムネイル画像をダブルクリックしたときに、ダイアログが出せるだけでも構いません。
(現在はダイアログも出せておりません)

ソースは長くなってしまうため、label名とダブルクリック処理のソースだけ記載しましたが、
必要であれば表示時のソース等も記載致します。

説明がわかりづらいかもしれませんが、どうかご助力の程、お願い致します。



この記事に返信する


えくー

リンク

2010/8/22(Sun) 16:24:39|NO.34571

「oncmd」はあくまでscreen等で作成したウィンドウのメッセージをとるもので、子ウィンドウでのダブルクリックなどは子ウィンドウ内で基本的に処理されるので親の方まで届きません
そこで、子ウィンドウから親ウィンドウへそれらの処理がなされたというメッセージを送ってもらうように頼みます

少々長いですがこんな感じに

#include "user32.as" GetClassLong hwnd, -26 SetClassLong hwnd, -26, stat | $8 oncmd gosub *lButtonDoubleClick, $0203 // WM_LBUTTONDBLCLK // 子からのダブルクリックの処理の設定___ #define WM_COMMAND 0x0111 #define set_notify( %1 ) \ GetWindowLong %1, -16 : \ SetWindowLong %1, -16, stat | 0x00004000//BS_NOTIFY oncmd gosub *onCommand, WM_COMMAND button gosub "適当", *tekitou hButton = objinfo( stat, 2 ) mes "hButton="+hButton set_notify hButton// BN_系を多めに送ってくれるよう指示 // 子にもダブルクリック受付 // をしないとダブルクリックされたメッセージを送ってくれない… GetClassLong hButton, -26 SetClassLong hButton, -26, stat | 0x08 // _____________________________ここまで stop *tekitou return *lButtonDoubleClick mes "親でダブルクリックの検出:wp("+wparam+") lp("+lparam+")" return *onCommand if ( lparam == hButton ) { code = ( (wparam>>16) & 0xffff )// hiword switch( code ) case 0// BN_CLICKED mes "子からのクリック通知です" swbreak case 5//BN_DOUBLECLICKED mes "子からのダブルクリック通知です" swbreak swend } return

ダブルクリック通知の前にクリック通知が来てしまいますが、まぁこれは多分しょうがないということで…^^;;;
それと右クリックなどがとれないです
もともとそんなに使われる機能でもないので、あまり充実してないような気がします
どうしても右クリックなどの所得がしたい場合は、また他の方法を考えた方がよさそうですね
(全くもって余談ですが、昔似た様な処理がしたいと思ったとき、結局ボタン上での右クリックがとれず、代わりにShiftを押しながらクリックしてもらうような仕様にして対応したりしました)



木村

リンク

2010/8/23(Mon) 01:58:40|NO.34574

 非常に原始的な方法ですが、getkey命令を利用してダブルクリックやシングルクリックを
判定する場合はボタン上でもどこでも取得はできるようです。

http://hspdev-wiki.net/?%BE%AE%A5%EF%A5%B6%2FHSP%A4%CE%A5%EB%A1%BC%A5%D7%B9%BD%C2%A4%A4%CE%C3%E6%A4%C7%C3%B1%A5%AF%A5%EA%A5%C3%A5%AF%A4%C8%BD%C5%A5%AF%A5%EA%A5%C3%A5%AF%A4%F2%BC%E8%C6%C0%A4%B9%A4%EB

 getkey命令の性質上、ループ構造を作らなければならずoncmd命令やonkey命令を使う場合に
比べてソースが汚れてしまうのが難点ですが、一応ダブルクリックを取るならこう言う手も
あるという事で提示させていただきました。



アイルー

リンク

2010/8/26(Thu) 16:54:00|NO.34640

返信遅くなりまして申し訳ありません。

>> えくー 様

ご回答ありがとうございます。
ご記載いただきましたソースを実行させていただきました。
親ウィンドウから子ウィンドウへ移る処理の部分、非常に勉強になりました。
ボタンクリック時にもダブルクリック処理の取得ができるようになりました。

22行目で定義されている
hButton

に対しての処理ですが、実際に自分で作成しているプログラムでは、 ボタンではなく、objimage を使用したものになります。 (No.34568でボタンクリックの処理と書いてしまって申し訳ありません。) いろいろと自分で試してはみたのですが、objimage に対応させるには、どのようにすればよろしいのでしょうか。 ボタンは以下のような感じになります。
*top
	/* 省略 */
	pos btnX, 360	
	objimage 7, 0, 0, 0, 50, 0, 100
	button goto "", *syori
	/* 省略 */

聞いてばかりになってしまって申し訳ありません。
以上、よろしくお願い致します。



アイルー

リンク

2010/8/26(Thu) 16:55:37|NO.34641

>> 木村 様

ご返信遅くなりまして申し訳ありません。
このような方法もあるのですね。

すぐに自分のソース内で試すのがむずかしそうなのですが、じっくりと考えて、
実際に動かしてみたいと思います。

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



えくー

リンク

2010/8/27(Fri) 22:56:13|NO.34664

うむむ、少々かっとばして説明しすぎてしまったようです、申し訳ありません

先に結論から言いますと、objimageを使っている場合でもbuttonの後にhButton=objinfo(stat, 2)とすれば問題ないはずです

ここから色々説明↓
hButtonにはボタンウィンドウのウィンドウハンドルが入っています
(screenなどで作ったウィンドウ以外にも、ボタンやリストボックスなどもそれと同じ一種の「ウィンドウ」と捉えてください)

ウィンドウハンドルとは、Win32APIでウィンドウに対して何か処理をする場合に、処理対象を特定するために各ウィンドウに割り当てられたWindowsが管理するIDみたいなものです
実際、SetClassLongやGetClassLongなどのWin32APIの引数には、それらAPIが認識できるウィンドウIDとしてhWndやhButtonを渡しているということです

さて、HSPの命令でそれらのボタンなどのパラメータを弄る時は、HSPが管理しているオブジェクトIDを指定すればいいのですが(objprmなどはその例ですね)、前述の通りWin32APIを使う時はウィンドウハンドルが分からないとどうしようもありません
そこで、objinfoを使うことでオブジェクトID⇒ウィンドウハンドルの変換をしています(objinfo命令自体はもっと他の事もできますので、気になるならばヘルプを見てみる事を勧めます)

ちなみに、スクリプトを眺めていると分かるかと思いますが、WM_COMMANDのlparamにはそのメッセージを送ったウィンドウのウィンドウハンドルが格納されています
ということで、複数のボタンのダブルクリックなどを管理したい場合は、switchなどでlparamの値とそれぞれのウィンドウハンドルを比較すればいいことになりますね

更に補足をしておきますと、私が提示したスクリプトでobjinfoの第一引数(オブジェクトID)にstatを指定していますが、実はHSPの仕様でbuttonやlistboxなどの命令を実行した後にはstatにそのオブジェクトIDが格納されることになっています
先ほどヘルプ見てみたらそのことが特に書かれてなかったので一応ここで補足ということで

ただ、一つ注意していただきたいのは、ダブルクリックの通知などをしてくれるように設定する時のウィンドウスタイルは、対象がボタンなのかリストなのかなどによって変わってくるのでそこは注意してください
(私のスクリプトでいうと、set_notifyでSetClassLongで論理和をとっている定数は、対象のウィンドウの種類によって変わってくるということ)


書きたいことを書いてしまったら酷い長さに…
長文駄文失礼しました



アイルー

リンク

2010/10/17(Sun) 20:36:40|NO.35415

えくー 様

こんばんは。
まずは…
申し訳ありません!

1ヵ月半ぶりくらいに、どうしても自分でできなかったところをお聞きしに、
この掲示板へ足を運んだのですが、先日の質問を見直しましたところ、
最後に返信したものが反映されておらず、返信なしの状態となってしまっていたようです。

気付かずにいてしまい、申し訳ございませんでした。

ご丁寧に説明をしていただきまして、ありがとうございます。
説明していただき、少し仕組みを知ることができました。

実はあのあと、教えていただいたことをもとに、自分なりにやってみたのですが、
やはりどうしてもうまく結果が出せませんでした。
(単体でやると、うまくいくのですが…)

だいぶ前のものになってしまったため、とりあえず新スレで新たにご質問させていただきます。
無知な自分に、細かくご説明いただきまして、
本当にありがとうございました。



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