スクリプト言語の HSP については、公式ホームページの「HSPTV!」をどうぞ。(戻る)
ここには、ストップウォッチのサンプル・ソースを載せておきます。
このストップウォッチは、WM_TIMER メッセージのタイマー・イベントを使って1秒間に20回更新させます。
- [START]ボタンは、ストップウォッチの開始(再開)
- [STOP]ボタンは、ストップウォッチの一時停止
- [RESET]ボタンは、ストップウォッチのリセット
上記の3つのボタンは、ストップウォッチの基本操作ボタンを用意してます。
[START]→[STOP]→[START]→[STOP]→[RESET]という感じでボタンを押す事になるでしょう。
ストップウォッチのソース
管理上このサンプルは sample352b.hsp のソースです。
//------------------------------------------------------------------------------ // ストップウォッチのサンプル by 科学太郎 //============================================================================== // 新規作成日:2019-07-08 (月) 11:38:00 // 最終更新日:2019-07-08 (月) 12:56:00 //------------------------------------------------------------------------------ #cmpopt varinit 1 #packopt hide 1 #packopt name __FILE__ # #include "User32.as" #include "Kernel32.as" //-------------------------------------- // 記号定数(API定数) //-------------------------------------- #const global NULL 0 #const global WM_TIMER $00000113 //-------------------------------------- // 記号定数 //-------------------------------------- #const WID_MAIN (0) ;ウインドウID #const TID_STOPWATCH (1) ;タイマーID #const TMS_STOPWATCH (50) ;タイマー間隔(ms) //-------------------------------------- // メイン部 //-------------------------------------- *Init dim nStart ;開始時間(ms) dim nCount ;経過時間(ms) dim nMode ;モード状態(0=停止,1=計測中) *Main screen WID_MAIN,700,75,SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_HIDE syscolor 15:boxf:color:title "ストップウォッチのサンプル by 科学太郎" font MSGOTHIC,75:SetTimer hWnd,TID_STOPWATCH,TMS_STOPWATCH,NULL ;設定 oncmd gosub *OnTimer, WM_TIMER onexit gosub *OnQuit ;配置 objsize 100,25 button gosub "START", *PushStart button gosub "STOP", *PushStop button gosub "RESET", *PushReset ;表示 DrawStopwatch gsel WID_MAIN,1 stop //-------------------------------------- // スタートの処理 //-------------------------------------- *PushStart if(nMode==0){ nMode=1:nStart=GetTickCount() } return //-------------------------------------- // ストップの処理 //-------------------------------------- *PushStop if(nMode){ nMode=0:nCount+=(GetTickCount()-nStart) } return //-------------------------------------- // リセットの処理 //-------------------------------------- *PushReset nStart=0 nCount=0 nMode=0 return //-------------------------------------- // タイマーの処理 //-------------------------------------- *OnTimer if(wParam==TID_STOPWATCH){ redraw 0 DrawStopwatch redraw 1 } return 0 //-------------------------------------- // ストップウォッチの描画 //-------------------------------------- #deffunc DrawStopwatch if(nMode):n=(nCount+(GetTickCount()-nStart)):else:n=nCount ;分離 t=(n\1000) :n/=1000 s=(n\60) :n/=60 m=(n\60) :n/=60 h=(n\24) :n/=24 d=(n\100) :n/=100 ;座標 s=strf("%02d\"%02d:%02d:%02d.%03d",d,h,m,s,t) n=strlen(s)*75/2 x=100+(600-n)/2 y=0 ;描画 color $80,$00,$00:boxf color $66,$00,$00:pos(x+2),(y+2):mes s color $FF,$00,$00:pos(x+0),(y+0):mes s return //-------------------------------------- // 終了時の割り込み処理 //-------------------------------------- *OnQuit KillTimer hWnd,TID_STOPWATCH end return //------------------------------------------------------------------------------ // End of sample352b.hsp //------------------------------------------------------------------------------
ストップウォッチの改良
上記の3つのボタンは、普通のストップウォッチのように[START/STOP]ボタン、[STOP/RESET]ボタンではありません。このようなボタンは nMode 変数の状態で呼び出すサブルーチンを切り分ければ良いのです。
つまり、次のようなサブルーチンを2つ用意すれば良いでしょう。
//-------------------------------------- // スタート/ストップの処理 //-------------------------------------- *PushStartStop if(nMode):gosub *PushStop:else:gosub *PushStart return //-------------------------------------- // ストップ/リセットの処理 //-------------------------------------- *PushResetStop if(nMode):gosub *PushStop:else:gosub *PushReset return
続いて、プッシュボタンの配置を少し改良してみます。
;配置 objsize 100,25 button gosub "START/STOP", *PushStartStop button gosub "STOP/RESET", *PushResetStop button gosub "RESET", *PushReset
これで良くありがちなストップウォッチのボタンになりましたね。
ストップウォッチのラップ機能
今回はストップウォッチの基本ソースを紹介してるためラップ機能はありません。
1着、2着のラップ時間の場合には、*PushLap というサブルーチンを用意してから
[LAP/RESET]ボタンの *PushResetLap というサブルーチンを用意すれば処理は簡単になります。
このサブルーチンについては、閲覧者(読者)の課題にしておきます。
ブログに載せるのは容易いですが、自分で考えてみるのも面白いと思います。
よって、ここではソースを公開しないでおきます。
スクリーン・ショット
関連記事
- アナログ時計のソース(1)
- アナログ時計のソース(2)
- デジタル時計のソース(1)
- デジタル時計のソース(2)
- ストップウォッチのソース
- タイマーのソース
※コメント投稿者のブログIDはブログ作成者のみに通知されます