プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

[HSP]ストップウォッチのソース

2019年07月10日 20時23分00秒 | HSP講座

スクリプト言語の 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 というサブルーチンを用意すれば処理は簡単になります。

このサブルーチンについては、閲覧者(読者)の課題にしておきます。
ブログに載せるのは容易いですが、自分で考えてみるのも面白いと思います。
よって、ここではソースを公開しないでおきます。

スクリーン・ショット

関連記事


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« [HSP]μウインドウ情報のソース | トップ | [HSP]タイマーのソース »
最新の画像もっと見る

コメントを投稿

HSP講座」カテゴリの最新記事