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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0125
noronbuttonについて4解決


noron

リンク

2014/1/25(Sat) 19:56:30|NO.59498

音楽プレーヤーを作っているのですが、
buttonで作ったボタンを押している間だけ音量を上げたり、
再生位置を進めたりするようにしたいのですがうまくいきません。
ボタンが押されている間だけ処理を行うことはできるんでしょうか?



この記事に返信する


ZAP

リンク

2014/1/25(Sat) 22:22:26|NO.59500

buttonで作ったボタンでは、押してから離したとき、その瞬間しか処理が飛ばないので無理です。
これはOSの仕様です。

ご質問のような仕様にするなら、自分でボタン用の画像を用いるなどして、
画像の任意の範囲をクリックしている間は再生処理をすすめる、
といった処理を自身で用意してやる必要があります。



noron

リンク

2014/1/25(Sat) 22:29:09|NO.59501

回答していただき、ありがとうございます!
自力で作ることも考えてみてはいたのですが、
処理を書くのが大変なのでためらっていました。
とりあえず挑戦してみようと思います!



inovia

リンク

2014/1/26(Sun) 00:13:05|NO.59505

サブクラス化してWM_LBUTTONDOWNメッセージを拾えば、それっぽいのは作れますね。

コールバック関数実装プラグイン hscallbk.dll for HSP3 が必要です。
http://chokuto.ifdef.jp/download/#hscallbk


#include "hscallbk.as" #include "user32.as" #define GWL_WNDPROC (-4) #define WM_LBUTTONDOWN 0x0201 #define WM_LBUTTONUP 0x0202 #define WM_TIMER 0x0113 // コールバック関数用ダミー #uselib "" #func BtnWndProc "" int, int, int, int Timer = 10 // タイマー呼び出し間隔ms Vol = 0 // 音量を保存する変数 title ""+strf("音量:%d ", Vol) // タイマー用 oncmd gosub *OnTimer, WM_TIMER // コールバック関数作成(ウィンドウプロシージャ) setcallbk Proc, BtnWndProc, *ButtonWndProc // ボタン作成 button gosub "音量↑", *dummy : hwnd_up = objinfo(stat, 2) // ウィンドウプロシージャを差し替えて、元のを保存しておく SetWindowLong hwnd_up, GWL_WNDPROC, varptr(Proc) oldWndProc_up = stat button gosub "音量↓", *dummy : hwnd_down = objinfo(stat, 2) // ウィンドウプロシージャを差し替えて、元のを保存しておく SetWindowLong hwnd_down, GWL_WNDPROC, varptr(Proc) oldWndProc_down = stat stop // タイマー処理 *OnTimer if wparam == 0{ Vol++ }else : if wparam == 1{ Vol-- } Vol = limit(Vol, 0, 100) title ""+strf("音量:%d ", Vol) return // 差し替えるボタンのウィンドウプロシージャ *ButtonWndProc // ボタンが押されたとき if callbkarg(1) == WM_LBUTTONDOWN{ // "音量↑" 用タイマーセット if callbkarg(0) == hwnd_up{ SetTimer hwnd, 0, Timer, 0 // "音量↓" 用タイマーセット }else : if callbkarg(0) == hwnd_down{ SetTimer hwnd, 1, Timer, 0 } // ボタンが押し上げられたとき }else : if callbkarg(1) == WM_LBUTTONUP{ // "音量↑" 用タイマー解除 if callbkarg(0) == hwnd_up{ KillTimer hwnd, 0 // "音量↓" 用タイマー解除 }else : if callbkarg(0) == hwnd_down{ KillTimer hwnd, 1 } } // 元のウィンドウプロシージャを呼び出す if callbkarg(0) == hwnd_up{ CallWindowProc oldWndProc_up, callbkarg(0), callbkarg(1), callbkarg(2), callbkarg(3) }else : if callbkarg(0) == hwnd_down{ CallWindowProc oldWndProc_down, callbkarg(0), callbkarg(1), callbkarg(2), callbkarg(3) } return // ダミー *dummy return



noron

リンク

2014/1/27(Mon) 18:39:10|NO.59534

inoviaさん、わざわざこんな立派なサンプルを作っていただいて、ありがとうございます!
若干自分には難しい部分もありますが、参考にさせていただきます!
(自分で作ろうとしていたものよりずっとすごいです…)



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