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

小ワザ

 HSP3.0a 

不定形リージョン

外部拡張DLLなんか使いたくないという天邪鬼さん用に。

  • ソースは汚いです。
  • 十分に見直してないのでバグ・高速化の余地はまだあると思います。
  • 修正などはご自由に。
  • ウィンドウ移動処理はさくらさんのスクリプトを参考にしています。
  • でかい画像だと遅いです。そういう時は黙って外部拡張DLL使いましょう。

見出し

ソース

一番遅いけど単純

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
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
-
|
|
|
|
|
!
-
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    // 不定形リージョンウィンドウ作成
    // 通常バージョン
    // pget & CreateRectRgnの組み合わせ
 
    // 必要なものをインクルード
    #include "user32.as"
    #include "gdi32.as"
    #include "winmm.as"    // これはリージョン作成に直接関係無し
    
    // ウィンドウ移動制御用の定数
    #define global WM_NCLBUTTONDOWN     $000000A1
    #define global HTCAPTION            2
 
    // モジュール記述
    #module
 
    // CreateWindowRgn p1(targetWin), p2(baseWin)
    // targetWin : 不定形リージョンを適用するウィンドウID
    // baseWin	 : 不定形リージョンを作成する絵があるウィンドウID
    #deffunc CreateWindowRgn int targetWin, int baseWin
 
    gsel baseWin
    wx = ginfo_winx : wy = ginfo_winy    // 画像サイズ取得
 
    pget 0, 0     // 透明色の取得(点(0,0)の色を透明色にする)
    tr = ginfo_r : tg = ginfo_g : tb = ginfo_b
 
    CreateRectRgn 0, 0, 0, 0    // 空のリージョンを用意
    tmpRgn = stat
 
    // 変数初期化
    x = 0 : y = 0 : flg = 0
    repeat wy
        repeat wx
            // 点(X,Y)の色を取得
            pget x, y
 
            // 透明色と比較
            if (wx == x + 1) | ((ginfo_r == tr) && (ginfo_g == tg) && (ginfo_b == tb)) {
                if flg == 1 {
                    CreateRectRgn sx, y, x, y + 1    // リージョン作成
                    gRgn = stat
                    CombineRgn tmpRgn, tmpRgn, gRgn, 2    // 空っぽのリージョンと結合
                    DeleteObject gRgn                 // 作ったら消す
                    flg = 0                // フラグを元に戻す
                }
            } else {
                if flg == 0 : sx = x : flg = 1
            }
            x++
        loop
        x = 0
        y++
    loop
    
    gsel targetWin            // ターゲットウィンドウをアクティブに
    SetWindowRgn hwnd, tmpRgn, 1    // リージョン設定
    DeleteObject tmpRgn        // 後片付け
    
    return
    
    #global
 
 
    // 以下動作確認プログラム
    // 以下説明省略
    gosub *me_time
    
    title "Now Loading..."
    buffer 2
    picload "nav.bmp"
 
    wx = ginfo_winx : wy = ginfo_winy
 
    bgscr 3, wx, wy
    gsel 3, -1
 
    timeGetTime
    st = stat
 
    CreateWindowRgn 3, 2
 
    timeGetTime
    et = stat
    
    gsel 0
    title "Start... Time is " + (et - st)
    gsel 3, 1
    
    gcopy 2, 0, 0, wx, wy
 
    redraw 0
 
    onclick *winmove
 
    stop
    
 *me_time
    timeBeginPeriod 1
    timeEndPeriod 1
    return
 
    // ウィンドウ移動制御
 *winmove
    if iparam == 3 : end
    if iparam : stop
    if ginfo_act != 3 : stop
 
    DefWindowProc hwnd,WM_NCLBUTTONDOWN,HTCAPTION,0
    MoveWindow hwnd, ginfo_wx1, ginfo_wy1, ginfo_sizex, ginfo_sizey, 1

そこそこ早い

動作確認プログラムは一緒なので上記のものを流用してください。

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
 71
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
-
|
|
|
|
|
!
-
|
!
 
 
 
 
 
 
 
 
 
 
 
 
 
    // 不定形リージョンウィンドウ作成
    // 画像データ使用バージョン
    // pget & CreateRectRgnに比べれば高速
 
    // 必要なものをインクルード
    #include "user32.as"
    #include "gdi32.as"
    #include "winmm.as"    // これはリージョン作成に直接関係無し
 
    // ウィンドウ移動制御用の定数
    #define global WM_NCLBUTTONDOWN     $000000A1
    #define global HTCAPTION            2
 
    // モジュール記述
    #module
 
    // CreateWindowRgn p1(targetWin), p2(baseWin)
    // targetWin : 不定形リージョンを適用するウィンドウID
    // baseWin   : 不定形リージョンを作成する絵があるウィンドウID
    #deffunc CreateWindowRgn int targetWin, int baseWin
 
    gsel baseWin
    
    mref vram, 66    // 画像データを取得
    
    wx = ginfo_winx : wy = ginfo_winy    // 画像サイズ取得
 
    pget 0, 0        // 透明色の取得(点(0,0)の色を透明色にする)
    tr = ginfo_r : tg = ginfo_g : tb = ginfo_b
 
    CreateRectRgn 0, 0, 0, 0    // 空のリージョンを用意
    tmpRgn = stat
 
    // 変数初期化
    // 注:yは画像データの構造上、下から。
    x = 0 : y = wy : flg = 0 : count = 0
    repeat wy
        repeat wx
            // 画像データの構造にそってRGB値を取得
            b = peek(vram,count)
            count++
            g = peek(vram,count)
            count++
            r = peek(vram,count)
            count++
            
            // 透明色と比較
            if (wx == x + 1) | ((r == tr) && (g == tg) && (b == tb)) {
                if flg == 1 {
                    CreateRectRgn sx, y - 1, x, y    // 下からスキャンなのでこうなる
                    gRgn = stat
                    CombineRgn tmpRgn, tmpRgn, gRgn, 2    // 空っぽのリージョンと結合
                    DeleteObject gRgn                 // 作ったら消す。一番の無駄処理
                    flg = 0                // フラグを元に戻す
                }
            } else {
                if flg == 0 : sx = x : flg = 1    // フラグ立てずに済む方法プリーズ
            }
            x++
        loop
        x = 0
        y--
    loop
    
    gsel targetWin            // ターゲットウィンドウをアクティブに
    SetWindowRgn hwnd, tmpRgn, 1    // リージョン設定
    DeleteObject tmpRgn        // 後片付け
    
    return
    
    #global
  • フラグ立てずに済む方法考えてみました。(速度無視):filev3api_RgnWindow.hsp -- kz3

今のところ一番早い

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
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
-
|
|
|
|
!
-
-
|
|
|
!
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
    // 不定形リージョンウィンドウ作成
    // CreatePolyPolygonRgn使用
    // 通常のpget & CreateRectRgnに比べてかなり高速
    
    // ただし、Windows9x系統では正常に動かない可能性あり
 
    // *ぼやき*
    // 恐らく一番早いのはExtCreateRectRgn。。。
    // けど、引数の内容が面倒なのでこれで妥協
    // ちなみにテスト画像は600x690(でか)
    // 普通の画像ならかなり早くなるはず
 
    // 必要なものをインクルード
    #include "user32.as"
    #include "gdi32.as"
    #include "winmm.as"    // これはリージョン作成に直接関係無し
 
    // ウィンドウ移動制御用の定数
    #define global WM_NCLBUTTONDOWN     $000000A1
    #define global HTCAPTION            2
 
    // リージョン作成用の定数
    #define global WINDING              2
 
    // モジュール記述
    #module
 
    // CreateWindowRgn p1(targetWin), p2(baseWin)
    // targetWin : 不定形リージョンを適用するウィンドウID
    // baseWin   : 不定形リージョンを作成する絵があるウィンドウID
    #deffunc CreateWindowRgn int targetWin, int baseWin
 
    gsel baseWin
 
    mref vram, 66        // 画像データを取得
    dim pt, 100000        // 点データ用配列
    dim ct, 100000        // 多角形点数記憶用配列
    
    wx = ginfo_winx : wy = ginfo_winy    // 画像サイズ取得
    
    pget 0, 0            // 透明色の取得(点(0,0)の色を透明色にする)
    tr = ginfo_r : tg = ginfo_g : tb = ginfo_b
 
    // 変数初期化
    // 注:yはデータ構造上、下から
    x = 0 : y = wy : flg = 0 : count = 0 : pt_cnt = 0 : poly_cnt = 0
    repeat wy
        repeat wx
            // 画像データの構造にそってRGB値を取得
            b = peek(vram,count)
            count++
            g = peek(vram,count)
            count++
            r = peek(vram,count)
            count++
 
            // 透明色と比較
            // 内部は説明面倒なので省略。やってることはIIと変わらない。
            if (wx == x + 1) | ((r == tr) && (g == tg) && (b == tb)) {
                if flg == 1 {
                    pt(pt_cnt) = x, y-1, x, y
                    pt_cnt += 4
                    ct(poly_cnt) = 4
                    poly_cnt++ : flg = 0
                }
            } else {
                if flg == 0 {
                    pt(pt_cnt) = x, y, x, y-1
                    pt_cnt += 4
                    flg = 1
                }
            }
            x++
        loop
        x = 0
        y--
    loop
 
    // 取得した情報からリージョン作成(詳細はMSDNやその他サイト参照)
    CreatePolyPolygonRgn varptr(pt), varptr(ct), poly_cnt, WINDING
    tmpRgn = stat
    
    gsel targetWin            // ターゲットウィンドウをアクティブに
    SetWindowRgn hwnd, tmpRgn, 1    // リージョン設定
    DeleteObject tmpRgn        // 後片付け
    
    return
    
    #global

その他

コメント

  • 意見等あればどうぞ。 -- lihiter? 2005-11-19 (土) 17:36:45
  • HSP2or3掲示板で独自コントロールの話題が出たので「CustCtrl?/Button」でリージョン作ってやろうと思ったら・・・^^; -- kz3 2005-11-20 (日) 08:40:04
  • 小ワザのWin32APIのところにリンク追加、ページ上部に小ワザへのリンクとver表記を追加しておきました。 -- kz3 2005-11-20 (日) 08:47:11
  • 4Byte境界調整中。 -- kz3 2005-11-20 (日) 12:16:55
  • あ、4byte境界のこと忘れてた。 -- lihiter? 2005-11-20 (日) 13:00:50
  • フラグ除去中。 -- kz3 2005-11-20 (日) 13:12:43
  • 出来た^^あとはヒットテストを入れてと・・・。 -- kz3 2005-11-20 (日) 13:16:44
    • 不定形リージョンにヒットテストを使うと元のウィンドウサイズが点線で縁取られてしまうのでクリックした座標とウィンドウ左上の位置関係から直に移動させる方法を取りました。 -- kz3 2005-11-20 (日) 15:26:36
    • ちなみに移動にSetWindowPos?()を使っているのはwidthではディスプレイ外への移動は出来なかったからですorz -- kz3
  • スクリプト整理中。 -- kz3 2005-11-20 (日) 13:27:54
  • ちょっと移動変更。 -- kz3 2005-11-20 (日) 13:43:07
  • よしっ、とりあえず移動と終了つけたのでUPします。不具合あったらお知らせよろしく! -- kz3 2005-11-20 (日) 14:11:30
  • lihiterさん同様(!?)、コード整理までしてないので読みにくいと思います。あとループも力まかせだったり・・・もっと良く考えればスマートな書き方が出来るかも。 -- kz3 2005-11-20 (日) 14:24:20
  • 早いかどうかより、フラグを抜くことを考えたスクリプト:filev3api_RgnWindow.hsp
  • リージョンウィンドウにした時に分かるように赤く染めてます。 -- kz3 2005-11-20 (日) 14:29:30
  • でかなり遅れましたが、lihiterさんこんにちわ!初めまして! -- kz3 2005-11-20 (日) 14:30:35
  • っていうかpngダメじゃん。bmpに変換してください。汗。 -- kz3 2005-11-20 (日) 14:33:42
  • 紛らわしいので画像はお手持ちの表示可能なものをご使用くださいってことで削除。。。 -- kz3 2005-11-20 (日) 14:34:55
  • 微妙に変になるところ発見・・・。 -- kz3 2005-11-20 (日) 14:40:14
  • ちょっと変更。 -- kz3 2005-11-20 (日) 14:49:43
  • screen -> bgscr にしました。むしろこっちのほうが自然かな? -- kz3 2005-11-20 (日) 14:56:04
  • kz3さん。ども、初めまして。やっぱり、バグありましたか(´・ω・`)ショボーン -- lihiter? 2005-11-20 (日) 14:57:56
  • ん〜フラグ無くしたつもりだけど実質、不透明色と透明色とで排他処理してるから同じようなものか・・・コピーとか言ってif文で不透明色ならCombineRgn?()無視だって出来るし・・・コピーは単純にハンドルの代入だけかな?3番目見てみようっと^^ -- kz3 2005-11-21 (月) 10:56:13
  • バグ発見したのでちょっと修正。4byte境界は今のところ無視(ぇ -- lihiter? 2005-11-22 (火) 09:23:02

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

添付ファイル:
filev3api_RgnWindow.hsp
563件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2008-04-11 (金) 17:40:26 (2066d)