>不定形リージョン
簡単に説明させていただくと、
不定形(好きな形)のウィンドウを作れる機能です。
wikiの不定形リージョンモジュール(今のところ一番早い)を
透過色を指定し、画像横幅が4の倍数で無い場合に対応できるよう一部改変しました。
https://wiki.hsp.moe/%E4%B8%8D%E5%AE%9A%E5%BD%A2%E3%83%AA%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3.html#g426bdbb
// 不定形リージョンウィンドウ作成
// 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
// tr,tg,tb : 透過色
#deffunc CreateWindowRgn int targetWin, int baseWin, int tr, int tg, int tb
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
vwidth = ginfo_winx * 3 + 3 & 0xFFFFFFFC; // VRAMで1列のバイト数
// 変数初期化
// 注:yはデータ構造上、下から
x = 0 : y = wy : flg = 0 : count = 0 : pt_cnt = 0 : poly_cnt = 0
repeat wy
count = vwidth * cnt; // 追加
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
// 以下サンプル
mes "終了用ウィンドウ"
// 表示ウィンドウ
bgscr 1, 110, 150
color 0,0,0
boxf 10,10,100,100
// 透過情報用バッファ
buffer 2, 110, 150 // 透過するウィンドウと同サイズにする
color 0,0,0
boxf 10,10,100,100
// 不定形リージョンの適用
CreateWindowRgn 1, 2, 255, 255, 255; // 表示するウィンドウID, 透過情報用のウィンドウID, 透過するRGB値
透過色にするRGB値が画像で使われていなければ
透過情報用のバッファを用意しなくても構いません。
その場合はCreateWindowRgnの1つ目と2つ目のIDを同じ値にしてください。