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

Module/regionfile

Module

 HSP3.0 

regionfile モジュール(HSP3)

リージョンデータをファイルにセーブ・ロードするためのモジュールです。 以下の命令が含まれています。

  • loadregion
    リージョンデータをロードします。
  • saveregion
    リージョンデータをセーブします。

ソース

filemod_regionfile.hsp
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
-
!
|
-
|
|
|
-
|
|
!
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
|
-
|
!
 
 
 
 
 
 
 
 
 
;#############################################################################
;
;	regionfile
;	HSP3 専用拡張モジュール
;						by naznyark
;
;	リージョンデータをファイルにセーブ・ロードするためのモジュールです。
;	以下の命令が含まれています。
;
;	loadregion
;		リージョンデータをロードします。
;	saveregion
;		リージョンデータをセーブします。
;
/*
%type
リージョンデータ操作拡張マクロ
%ver
1.0
;%note
%date
2006/01/04
%author
naznyark
%dll
mod_regionfile
;%url
*/;
 
#ifdef __HSP30__
#ifndef __MODREGIONFILE__
#define __MODREGIONFILE__
;=============================================================================
#module "regionfile"
    #uselib "gdi32.dll"
    #func _ExtCreateRegion    "ExtCreateRegion"    int, int, int
    ;	lpXform, nCount, lpRgnData
    #func _GetRegionData "GetRegionData"    int, int, int
    ;	hRgn, dwCount, lpRgnData
;-----------------------------------------------------------------------------
#deffunc loadregion str _p1, var _p2
/*
%index
loadregion
リージョンデータをファイルからロード
%group
リージョンデータ操作拡張マクロ命令
%prm
str p1, var p2
p1 : ロードするファイル名
p2 : ロードしたリージョンのリージョンハンドルが格納される変数
%inst
リージョンデータをファイルからロードします。
 
p1 で指定したファイル名のリージョンデータファイルを読み込み、
そのデータから作成したリージョンのリージョンハンドルを p2 に代入します。
 
stat に命令が成功すると 0 以外の値、失敗すると 0 が代入されます。
%href
loadregion
saveregion
*/
    exist _p1
    if strsize=-1 : return 0
    nRgnSize=strsize
 
    sdim RGNDATA, nRgnSize
    bload _p1, RGNDATA, nRgnSize
 
    dupptr nRHSize, varptr(RGNDATA), 4, 4
    dupptr nRDSize, varptr(RGNDATA)+12, 4, 4
    if nRHSize+nRDSize ! nRgnSize {
        dialog {"
		正しいリージョンデータファイルではありません。"}, 1, "エラー"
        rp=0
    } else {
        _ExtCreateRegion 0, nRgnSize, varptr(RGNDATA)
        _p2=stat
        rp=nRgnSize
        if stat=0 {
            dialog "リージョン作成に失敗しました。", 1, "エラー"
            rp=0
        }
    }
 
    sdim RGNDATA, 64
    return rp
;-----------------------------------------------------------------------------
#deffunc saveregion str _p1, int _p2
/*
%index
saveregion
リージョンデータをファイルにセーブ
%group
リージョンデータ操作拡張マクロ命令
%prm
str p1, int p2
p1 : セーブするファイル名
p2 : セーブするリージョンのリージョンハンドル
%inst
リージョンデータをファイルにセーブします。
 
p2 で指定したリージョンのデータを
p1 で指定したファイル名のリージョンデータファイルにセーブします。
 
stat に命令が成功すると 0 以外の値、失敗すると 0 が代入されます。
%href
loadregion
saveregion
*/
    _GetRegionData _p2, 0, 0
    nRgnSize=stat
    sdim RGNDATA, nRgnSize
    _GetRegionData _p2, nRgnSize, varptr(RGNDATA)
    rp=stat
 
    if stat=0 {
        dialog "リージョンデータ取得に失敗しました。", 1, "エラー"
    } else {
        bsave _p1, RGNDATA, nRgnSize
    }
 
    sdim RGNDATA, 64
    return rp
;-----------------------------------------------------------------------------
#global
;=============================================================================
#endif
#endif
;#############################################################################

サンプルプログラム

サンプル 1
リージョンを作成してファイルに保存。

不定形リージョンのモジュールを改造して使用しています。
(エラーが出る場合はソース内の screen 1 を buffer 1にかえると動くかも)

filesample01_mod_regionfile.hsp
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
-
-
|
|
|
|
!
-
-
|
|
|
!
!
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
;	mod_regionfile サンプルプログラム
;	不定形リ−ジョンの作成と保存
;
 
;	以下のモジュール部は
;	HSP開発WiKi(不定形リージョン) にあったものの末尾を少し変えたもの
;	HSP開発WiKi  http://hspwiki.nm.land.to/?Top
 
;============================================================================
     // 不定形リージョンウィンドウ作成
    // 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
 
    return tmpRgn
    
    #global
 
;============================================================================
 
;	サンプル本体
 
    #include "mod_regionfile.hsp"
 
    onexit *exit
    crdir=dirinfo(0)
    objsize 256,24
    button "画像ファイルを読み込みリージョン作成", *makergn
    stop
 
*makergn
    chdir dirinfo(1)+"\\sample\\demo"
    dialog "bmp;*.gif;*.jpg",16
    if stat=0 : stop
    screen 1
    picload refstr
    gsel 0, 1
    redraw 0
    color 255,255,255 : boxf
    color : pos 0, 24 : mes "処理中。お待ちください"
    redraw 1
    if hRgn ! 0 : DeleteObject hRgn
    CreateWindowRgn 0, 1
    hRgn=stat
    gsel 0, 1
    if hRgn=0 : mes "失敗しました。" : stop
    mes "リージョンを作成しました。"
    button "ファイル名を指定してリージョンデータを保存", *savergn
    mes "(拡張子は .dat になります。)"
    stop
 
*savergn
    chdir crdir
    sdim filename, 260
    dialog "dat;*.*", 17, "リージョンデータファイル"
    if stat=0 : stop
    filename=refstr
    if strmid(filename, -1, 4) ! ".dat" : filename+=".dat"
    saveregion filename, hRgn
    mes "リージョンデータを保存しました。"
    mes filename
    stop
 
*exit
    if hRgn ! 0 : DeleteObject hRgn
    end

サンプル 2
あらかじめ作成したリージョンを使用してウィンドウ形状を変更。

次のファイルが必要となります。

  • filesampleimage_rgn.dat

    (参考)リージョン作成の元となった画像

    sampleimage.jpg
    filesample02_mod_regionfile.hsp
    Everything is expanded.Everything is shortened.
      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
    
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    
    ;	mod_regionfile サンプルプログラム
    ;	あらかじめ用意したリージョンデータを使用してウィンドウ形状を変更
    ;
     
        #include "user32.as"
        #include "mod_regionfile.hsp"
     
        screen 0
     
        loadregion "sampleimage_rgn.dat", hrgn
        if stat=0 : dialog "error" : end
     
        bgscr 1
        width 320, 240, 100, 100
        color 255, 0, 0 : boxf
        SetWindowRgn hwnd, hrgn, 1
        stop
       

コメント


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

naznyark 2006-01-05 (木) 00:52:59

  • mod_regionfile.hsp
  • sample01_mod_regionfile.hsp
  • sample02_mod_regionfile.hsp

    初公開。


トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:31:22 (2436d)