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

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

[HSP]タイマーのソース

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

スクリプト言語の HSP については、公式ホームページの「HSPTV!」をどうぞ。(戻る)


ここには、タイマーのサンプル・ソースを載せておきます。
このタイマーは、WM_TIMER メッセージのタイマー・イベントを使って1秒間に20回更新させます。

  • [START]ボタンは、タイマーの開始(再開)
  • [STOP]ボタンは、タイマーの一時停止
  • [RESET]ボタンは、タイマーのリセット

上記の3つのボタンは、タイマーの基本操作ボタンを用意してます。
[START]→[STOP]→[START]→[STOP]→[RESET]という感じでボタンを押す事になるでしょう。
なお、プリセット・ボタンを押さずに[START]ボタンを押すとストップウォッチ機能になります。

  • [1分]ボタンは、1分用のプリセット
  • [2分]ボタンは、2分用のプリセット
  • [3分]ボタンは、3分用のプリセット
  • [4分]ボタンは、4分用のプリセット
  • [5分]ボタンは、5分用のプリセット
  • [6分]ボタンは、6分用のプリセット
  • [7分]ボタンは、7分用のプリセット
  • [8分]ボタンは、8分用のプリセット
  • [9分]ボタンは、9分用のプリセット
  • [10分]ボタンは、10分用のプリセット

上記の10個のボタンは、プリセット・タイマーの操作ボタンです。
このボタン類は押すとタイマー時間が自動的にセットされて、即タイマーが開始されます。
動作中にプリセット・ボタンを押すとタイマーが一時停止します。
一時停止中にプリセット・ボタンを押すとタイマー時間が自動的にセットされます。
タイマー時間がセットされた時に、プリセット・ボタンを押すとタイマーが開始されます。
つまり、
(00"00:02:59.456) [3分]ボタンを押すと自動的に3分タイマーが開始される。

(00"00:02:58.281) [5分]ボタンを押すと一時停止状態になる。

(00"00:05:00.000) [5分]ボタンを押すとタイマー時間がセットされる。

(00"00:04:59.456) [5分]ボタンを押すと自動的に5分タイマーが開始される。

(00"00:04:56.500) [STOP]ボタンを押すとタイマーは一時停止される。

(00"00:05:00.000) [RESET]ボタンを押すとタイマー時間がプリセットされる。

(00"00:00:00.000) [RESET]ボタンを押すとタイマー時間がリセットされる。
このような感じで動作します。

タイマーのソース

管理上このサンプルは sample353b.hsp のソースです。

//------------------------------------------------------------------------------
// タイマーのサンプル by 科学太郎
//==============================================================================
// 新規作成日:2019-07-08 (月) 11:38:00
// 最終更新日:2019-07-10 (水) 16:12: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_TIMER        (1)             ;タイマーID
#const TMS_TIMER        (50)            ;タイマー間隔(ms)

//--------------------------------------
// メイン部
//--------------------------------------
*Init
    dim nPreset                         ;タイマー時間(ms)
    dim nStart                          ;開始時間(ms)
    dim nCount                          ;経過時間(ms)
    dim nMode                           ;モード状態(0=停止,1=計測中)
*Main
    screen WID_MAIN,700,100,SCREEN_NORMAL|SCREEN_FIXEDSIZE|SCREEN_HIDE
    syscolor 15:boxf:color:title "タイマーのサンプル by 科学太郎"
    font MSGOTHIC,75:SetTimer hWnd,TID_TIMER,TMS_TIMER,NULL
    ;設定
    oncmd   gosub *OnTimer, WM_TIMER
    onexit  gosub *OnQuit
    ;配置(1)
    objsize 100,25
    button gosub "START",   *PushStart
    button gosub "STOP",    *PushStop
    button gosub "RESET",   *PushReset
    ;配置(2)
    objsize 70,25
    x=ginfo_cx
    y=ginfo_cy
    repeat 10
        pos x,y:x+=70:button gosub strf("%d分",cnt+1), *PushTimer
    loop
    ;表示
    DrawTimer
    gsel WID_MAIN,1
    stop
//--------------------------------------
// スタートの処理
//--------------------------------------
*PushStart
    if(nMode==0){
        nMode=1:nStart=GetTickCount()
    }
    return
//--------------------------------------
// ストップの処理
//--------------------------------------
*PushStop
    if(nMode){
        nMode=0:nCount+=(GetTickCount()-nStart)
    }
    return
//--------------------------------------
// リセットの処理
//--------------------------------------
*PushReset
    if(nStart==0)and(nCount==0)and(nMode==0){
        nPreset=0
    }
    else{
        nStart=0
        nCount=0
        nMode=0
    }
    return
//--------------------------------------
// ラーメンタイマーの実行
//--------------------------------------
*PushTimer
    if(nMode):gosub *PushStop:return
    ;設定
    h=(0)
    m=(stat-3)+1
    s=(0)
    nPreset=((h*3600)+(m*60)+s)*1000
    ;リセット
    if(nStart):gosub *PushReset:return
    if(nCount):gosub *PushReset:return
    ;スタート
    gosub *PushStart
    return
//--------------------------------------
// タイマーの処理
//--------------------------------------
*OnTimer
    if(wParam==TID_TIMER){
        redraw 0
        DrawTimer
        redraw 1
    }
    return 0
//--------------------------------------
// タイマーの描画
//--------------------------------------
#deffunc DrawTimer
    if(nMode):n=(nCount+(GetTickCount()-nStart)):else:n=nCount
    ;タイマー
    if(nPreset){
        n=(nPreset-n)
        if(n<0):gosub *PushReset:dialog "時間ですよ~。",0,"確認":return
    }
    ;分離
    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_TIMER
    end
    return
//------------------------------------------------------------------------------
// End of sample353b.hsp
//------------------------------------------------------------------------------

上記のソースは、前回のストップウォッチのサンプル・ソースを少し改良した形です。
そのため DrawStopwatch 命令と DrawTimer 命令の違いはタイマー部を少し追加した形になります。

タイマーの改良

上記の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

続いて、プッシュボタンの配置を少し改良してみます。

    ;配置(1)
    objsize 100,25
    button gosub "START/STOP",  *PushStartStop
    button gosub "STOP/RESET",  *PushResetStop
    button gosub "RESET",       *PushReset

これで良くありがちなタイマーのボタンになりましたね。

タイマーのテンキー機能

今回はタイマーの基本ソースを紹介してるためテンキー機能はありません。
テンキーによる入力には、時、分、秒の3つに分けた変数を用意してから SetTenKey 命令を実装します。
この他にもテンキー入力状態の bInput フラグ変数も必要になるでしょう。
この bInput フラグ変数を見て DrawTimer 命令、*PushStart サブルーチンを見直します。

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

スクリーン・ショット

関連記事


コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« [HSP]ストップウォッチのソ... | トップ | HSPの広場 - トップページ »
最新の画像もっと見る

コメントを投稿

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