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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1004
大富豪Aクリックに反応しない10解決


大富豪A

リンク

2012/10/4(Thu) 16:07:07|NO.49736

http://rpen.blogspot.jp/2007/09/blog-post.html
のスクリプトの一部を

// マウスの左ボタンを離した時の処理 *LButtonUp   if a=0:dialog "クリック":a=1 dragging = 0 // ドラッグ終了 return *MouseMove // ドラッグ中ならば矩形を移動 get_x rects( pointing_rect ), x get_y rects( pointing_rect ), y move_rect rects( pointing_rect ), x + mousex - dx, y + mousey - dy dx = mousex : dy = mousey : a=1 // ドラッグ中でないならばポイントしている矩形を調べる get_pointing_rect rects pointing_rect = stat a=0
と改造しました。
マウスのクリック判定はできたんですが、時々反応しないときがあります。
全てのクリックに反応させるには、どうすればいいですか?



この記事に返信する


(´ω`)

リンク

2012/10/4(Thu) 18:59:43|NO.49757

これは、反応しないのではなく反応が遅れてるようですね。なるほど。
それと、本来は矩形内では反応しないはずが、連打すると時々反応するようです。
割り込み頻度が多すぎて処理が遅れてるっぽいです。

常時WM_MOUSEMOVE割り込みが発生してる状態ですが、さらりと見る限りこの部分の処理は
メインループで回してさしつかえなさそうですし、*MouseMoveのサブルーチンをメインループ
で回すように改造し、割り込み頻度を下げれば改善できます。ていうか、できました。

レッツチャレンジ。(´ω`)



大富豪A

リンク

2012/10/4(Thu) 19:33:07|NO.49763

>(´ω`)さん
*MouseMoveのサブルーチンをメインループで回すまでは出来たんですが、ドラッ
グ後も、必ずクリックに反応します。
ドラックだったら、反応しないスクリプトは、どうするんですか?
ヒントくださ~い。



てん

リンク

2012/10/4(Thu) 19:52:07|NO.49768

現状がわからないので、改変後のスクリプトを全文貼ってもらえませんか?



大富豪A

リンク

2012/10/4(Thu) 20:05:55|NO.49775

モジュールは一緒です。

*init // 乱数初期化 randomize // 矩形を5つ作成 repeat 5 w = rnd( 100 ) + 100 : h = rnd( 100 ) + 50 newmod rects, mdl_rect, rnd( ginfo_winx - w ), rnd( ginfo_winy - h ), w, h, rnd( 191 ) loop repeat getkey b, 1 if b = 1 { if dragging { // ドラッグ中ならば矩形を移動 get_x rects( pointing_rect ), x get_y rects( pointing_rect ), y move_rect rects( pointing_rect ), x + mousex - dx, y + mousey - dy dx = mousex : dy = mousey : a = 1 //1だったらクリック } else { // ドラッグ中でないならばポイントしている矩形を調べる get_pointing_rect rects pointing_rect = stat a = 0//0だったらクリック } if ( pointing_rect >= 0 ) { // 矩形をポイントしている場合はその矩形をドラッグする dx = mousex : dy = mousey dragging = 1 } }else{ if a = 1 : dialog "クリック" : a = 0    dragging = 0 // ドラッグ終了 } // 画面を更新 gosub *renew_screen wait 1 loop // // 画面の更新 *renew_screen redraw 0 color 255, 255, 255 : boxf foreach rects draw_rect rects( cnt ) loop redraw 1 return

メインループ内で全て処理を行わせています。
マウスカーソルはいちいち変更するのが嫌なので消しました。



てん

リンク

2012/10/4(Thu) 20:11:19|NO.49776

このプログラムがドラッグ終了時にダイアログを表示するのは「仕様」ですね。
もう一度、プログラムの流れを順をおって確認してみてください。

ちなむと、おそらくさっき上でアドバイスされていたことは
WM_MOUSEMOVEだけをメインループで処理し、
WM_LBUTTONDOWNとUPはoncmd時のみの処理でいいのかと思います。
そうすれば一々getkeyも使わないでいいので楽になりますよ。



てん

リンク

2012/10/4(Thu) 20:18:59|NO.49777

すいません、的はずれな事書いてましたね。
クリックとドラッグの判別ということでしたが、時間で判断されてはどうでしょうか。
・一定時間以内にマウスを離したらクリックとみなす
・一定時間以上マウスを押し続けたらドラッグと判断する
とか



てん

リンク

2012/10/4(Thu) 20:29:23|NO.49778



クリックだったら色を変えるようにしてみました


// ドラッグできる矩形 // マウスカーソル変更用命令(参考:http://lhsp.s206.xrea.com/hsp_mouse.html#3) #uselib "user32" #cfunc LoadCursor "LoadCursorA" nullptr, int #func SetClassLong "SetClassLongA" int, int, int // ウィンドウメッセージ #const WM_LBUTTONDOWN 0x0201 #const WM_LBUTTONUP 0x0202 //#const WM_MOUSEMOVE 0x0200 ←①WM_MOUSEMOVEは一々メッセージ処理をしないようにして #const Duration_Click 160 //クリックとみなす間隔(ms) // LoadCursor用引数 #const IDC_ARROW 0x7F00 #const IDC_HAND 0x7F89 // // 矩形を扱うモジュール #module mdl_rect x, y, w, h, c #const BORDER_WIDTH 2 #modinit int _x, int _y, int _w, int _h, int _c x = _x : y = _y w = _w : h = _h c = _c \ 192 return // // 矩形の色を変更 #modfunc setcolor_rect int _c c = _c \ 192 return // // 矩形を描画 #modfunc draw_rect hsvcolor c, 255, 191 boxf x, y, x + w, y + h hsvcolor c, 255, 255 boxf x + BORDER_WIDTH, y + BORDER_WIDTH, x + w - BORDER_WIDTH, y + h - BORDER_WIDTH return // // 矩形を移動 #modfunc move_rect int _x, int _y x = _x : y = _y return // // 点(px, py)が矩形内にあるか否かを返す #modfunc point_rect int px, int py return ( x <= px ) & ( y <= py ) & ( px < x + w ) & ( py < y + h ) // // 矩形のX座標を返す #modfunc get_x var ret ret = x return // // 矩形のY座標を返す #modfunc get_y var ret ret = y return // // 今ポイントしている矩形を調べ、その配列要素番号をstatに返す(なにもない時は-1) #deffunc get_pointing_rect array rects, local result result = -1 foreach rects point_rect rects( cnt ), mousex, mousey if stat : result = cnt ; break loop return result #global *init // 乱数初期化 randomize // Windowsメッセージ割り込み実行指定 oncmd gosub *LButtonDown, WM_LBUTTONDOWN oncmd gosub *LButtonUp, WM_LBUTTONUP oncmd gosub *MouseMove, WM_MOUSEMOVE // 矩形を5つ作成 repeat 5 w = rnd( 100 ) + 100 : h = rnd( 100 ) + 50 newmod rects, mdl_rect, rnd( ginfo_winx - w ), rnd( ginfo_winy - h ), w, h, rnd( 191 ) loop // マウスカーソルの種類を記録する変数を初期化 cursor_type = IDC_ARROW // 画面の更新 gosub *renew_screen //②メインループでWM_MOUSEMOVEと同様の処理をする。 *main gosub *MouseMove wait 1 goto *main // // 画面の更新 *renew_screen redraw 0 color 255, 255, 255 : boxf foreach rects draw_rect rects( cnt ) loop redraw 1 return // // マウスの左ボタンを離した時の処理 *LButtonUp time_LButtonUp = (gettime(5)*60+gettime(6))*1000+gettime(7) if time_LButtonUP - time_LButtonDown <= Duration_Click { //マウスを押し下げたた時刻(秒)と上げた時刻(秒)がDuration_Click以内の時 setcolor_rect rects( pointing_rect ), rnd(191) } dragging = 0 // ドラッグ終了 return // // マウスの左ボタンを押した時の処理 *LButtonDown if ( pointing_rect >= 0 ) { // 矩形をポイントしている場合はその矩形をドラッグする dx = mousex : dy = mousey dragging = 1 time_LButtonDown = (gettime(5)*60+gettime(6))*1000+gettime(7) } return // // マウスが動いたときの処理 *MouseMove if ( pointing_rect >= 0 ) & ( cursor_type != IDC_HAND ) { // 矩形の上ではカーソルを手の形に変更 cursor_type = IDC_HAND gosub *ChangeCursor } if ( pointing_rect < 0 ) & ( cursor_type != IDC_ARROW ) { // 矩形の外ではカーソルを通常の形に変更 cursor_type = IDC_ARROW gosub *ChangeCursor } if dragging { // ドラッグ中ならば矩形を移動 get_x rects( pointing_rect ), x get_y rects( pointing_rect ), y move_rect rects( pointing_rect ), x + mousex - dx, y + mousey - dy dx = mousex : dy = mousey } else { // ドラッグ中でないならばポイントしている矩形を調べる get_pointing_rect rects pointing_rect = stat } // 画面を更新 gosub *renew_screen return // // マウスカーソルの変更 *ChangeCursor SetClassLong hwnd, -12, LoadCursor( cursor_type ) mouse // マウスカーソルの更新(これがないと即座に反映されない) return



(´ω`)

リンク

2012/10/4(Thu) 20:53:13|NO.49779

すでに解答が出てしまったので、閑話休題。

「メインループで回しても差し支えなさそう」と書いたのですが、元々のソースは
HSPを使ってイベントドリブンだけで処理してみるのが目的だったからそういう書き方を
してたみたいですね。

モジュールの作り方とかがステキで、逆に私も勉強になりました。(´ω`)



大富豪A

リンク

2012/10/4(Thu) 20:54:04|NO.49780

>てんさん
なるほどです!
時間で判断する方法ですか。
スクリプトまで付けていただいてありがとうございます。



大富豪A

リンク

2012/10/4(Thu) 20:56:17|NO.49782

>(´ω`)さん
メインループで回すことなどいろいろ知恵をだしてくれてありがとうございました。



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