HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0717
krgrg透明色の窓内の任意の場所に画像や図形を描きたい4解決


krgrg

リンク

2020/7/17(Fri) 23:24:12|NO.91016

題名の通りですが
透明色の窓内の任意の場所に画像や図形を描きたいですが、このような事は可能でしょうか?



この記事に返信する


あらや

リンク

2020/7/18(Sat) 00:34:27|NO.91018

確認させていただきたいのですが

>透明色の窓内
透明色の窓内というのは
不定形リージョンなどを使用してウィンドウを透明化しているという事でしょうか?
ウィンドウの透明化にはリージョン以外にも手法があるので
どの手法でウィンドウを透明にしているのかを教えて頂きたいです。

>任意の場所に画像や図形を描きたい
そして、これは画像や図形を描画した箇所のみ
透明化を解除したいという解釈で間違いないでしょうか?



krgrg

リンク

2020/7/18(Sat) 01:03:39|NO.91019

確認させていただきたいのですが

>>不定形リージョンなどを使用してウィンドウを透明化しているという事でしょうか?

不定形リージョンという用語がわからないですが、冒頭部分は以下のような感じです

(※タスクバーからでしか閉じれません)
 例)
gsel 0,2 ;最前面
bgscr 0, 110, 150
color 0,0,0
boxf 10,10,100,100


この白くなる部分を常に透明にしたいです


>>そして、これは画像や図形を描画した箇所のみ
透明化を解除したいという解釈で間違いないでしょうか?

はい、そうです



あらや

リンク

2020/7/18(Sat) 03:33:52|NO.91020

>不定形リージョン
簡単に説明させていただくと、
不定形(好きな形)のウィンドウを作れる機能です。



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を同じ値にしてください。



krgrg

リンク

2020/7/18(Sat) 07:14:18|NO.91021

早速のお返事、サンプル付きでありがとうございます。
説明付きで判りやすいのでとても助かりました!

また何かありましたら質問させていただきます。



ONION software Copyright 1997-2023(c) All rights reserved.