hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
小ワザ/HSPのループ構造の中で単クリックと重クリックを取得する - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ/HSPのループ構造の中で単クリックと重クリックを取得する

	
最終更新日 : 2010-08-23 (月) 01:51:39

 Win32APIを使わずともシングルクリックとダブルクリックを判別して取得する事は可能である。  ただし、この方法はループ構造中でないと使えない難点がある。

実装用モジュール

適当に作成 by 木村


Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
-
|
-
|
|
!
|
|
!
|
!
 
 
    #module md_click_checker
    #define CHECK_TIME 100
    #define COPY_SIZE (CHECK_TIME-1)*4
    #define NOW 0
    #define NO_CLICK 0
    #define DRAGGING 1
    #define DELAY_CHECK 2
    #define SINGLE_CLICK 4
    #define DOUBLE_CLICK 8
    #define ctype KEY_DATE(%1) click_record(%1,key_code)
 
    #deffunc init_click_checker
    dim click_record, CHECK_TIME, 500
    return
 
    #deffunc click_checker int key_code, int delay_time, \
            local stock, local br, local ret_stat, local clicked
    //クリック状況を更新
    dim stock, CHECK_TIME-1
    memcpy stock, KEY_DATE(0), COPY_SIZE, 0, 0
    memcpy KEY_DATE(1), stock, COPY_SIZE, 0, 0
    getkey br, 1
    KEY_DATE(NOW) = br
    //今までのクリックデータから現状を類推する(ドラッグ中判定編)
    if KEY_DATE(NOW) = 1 : return DRAGGING
    //同上(判定時間待ち判定編)
    repeat delay_time
        if KEY_DATE(cnt) = 1 : ret_stat = DELAY_CHECK : break
    loop
    if ret_stat = DELAY_CHECK : return DELAY_CHECK
    //同上(クリック&ダブルクリック判定編)
    ret_stat = NO_CLICK
    if KEY_DATE(delay_time) = 1 {
        ret_stat = SINGLE_CLICK
        repeat CHECK_TIME-delay_time, delay_time
            if KEY_DATE(cnt) = 0 {
                repeat delay_time, cnt
                    if (KEY_DATE(cnt)=0) & (KEY_DATE(cnt+1)=1) {
                        ret_stat = DOUBLE_CLICK
                        break
                    }
                loop
                break
            }
        loop
    }
    return ret_stat
    #global

実用例


Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
|
-
|
-
|
|
!
|
|
!
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    ;――――――――――――――――――――――――――――――――――――――――
    ;		実装部分を定義
    ;――――――――――――――――――――――――――――――――――――――――
    #module md_click_checker
    #define CHECK_TIME 100
    #define COPY_SIZE (CHECK_TIME-1)*4
    #define NOW 0
    #define NO_CLICK 0
    #define DRAGGING 1
    #define DELAY_CHECK 2
    #define SINGLE_CLICK 4
    #define DOUBLE_CLICK 8
    #define ctype KEY_DATE(%1) click_record(%1,key_code)
 
    #deffunc init_click_checker
    dim click_record, CHECK_TIME, 500
    return
 
    #deffunc click_checker int key_code, int delay_time, \
            local stock, local br, local ret_stat, local clicked
    //クリック状況を更新
    dim stock, CHECK_TIME-1
    memcpy stock, KEY_DATE(0), COPY_SIZE, 0, 0
    memcpy KEY_DATE(1), stock, COPY_SIZE, 0, 0
    getkey br, key_code
    KEY_DATE(NOW) = br
    //今までのクリックデータから現状を類推する(ドラッグ中判定編)
    if KEY_DATE(NOW) = 1 : return DRAGGING
    //同上(判定時間待ち判定編)
    repeat delay_time
        if KEY_DATE(cnt) = 1 : ret_stat = DELAY_CHECK : break
    loop
    if ret_stat = DELAY_CHECK : return DELAY_CHECK
    //同上(クリック&ダブルクリック判定編)
    ret_stat = NO_CLICK
    if KEY_DATE(delay_time) = 1 {
        ret_stat = SINGLE_CLICK
        repeat CHECK_TIME-delay_time, delay_time
            if KEY_DATE(cnt) = 0 {
                repeat delay_time, cnt
                    if (KEY_DATE(cnt)=0) & (KEY_DATE(cnt+1)=1) {
                        ret_stat = DOUBLE_CLICK
                        break
                    }
                loop
                break
            }
        loop
    }
    return ret_stat
    #global
 
 
    ;――――――――――――――――――――――――――――――――――――――――
    ;		モジュール内部の変数を初期化する
    ;――――――――――――――――――――――――――――――――――――――――
    init_click_checker        //click_checker命令を使う前に一回だけ定義する
 
 
    ;――――――――――――――――――――――――――――――――――――――――
    ;		本編(単クリック乃至重クリックと判断するとメッセージが書かれる)
    ;――――――――――――――――――――――――――――――――――――――――
    repeat
        click_checker 1, 6
        switch stat
        case 4 : mes "シングルクリック" : swbreak
        case 8 : mes "ダブルクリック" : swbreak
        swend
        wait 2
    loop

 click_checker命令は毎ループ毎にキーの入力状態を確認し、そのデータからクリック状態を判別する命令である。


 第1引数には状態を確認したいキーコードを入力する。

 キーコードはgetkey命令で用いられる値を参照する事。

 今回は左クリックの判断をしたかったので1としたが、右クリックを求める為に2を入れたり、キーボードのキーコードを入れる事も可能である。


 第2引数は短クリックか重クリックかを判別する為の猶予フレーム数を入力する。

 今回の6であれば、6フレームの間は入力を待ち、6フレームの間入力が無かった場合にようやくクリック状態を返す、と言う意味となる。

 フレーム数が大きければ、ゆっくりとした重クリックにも対応できる。

 しかし、大き過ぎると早めの単クリック2回が重クリックに誤読される可能性もあるので、ループのwaitやユーザーの事を加味して値を決める必要がある。


 クリックの状態はシステム変数statに返される。

 4が単クリック、8が重クリックであるが、それ以外にも1はドラッグ中、2は猶予フレーム中である事を意味している。


URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2010-08-23 (月) 01:51:39 (1203d)