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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0221
ᴘᴏɪᴜʏᴛʀᴇᴡウィンドウの一部を半透明にする8解決


ᴘᴏɪᴜʏᴛʀᴇᴡ

リンク

2020/2/21(Fri) 12:22:23|NO.89523

bgscrで描画したタイトルバーのないウィンドウの上部を半透明にしようと思うのですが、
私の知識ではウィンドウ全体を半透明にすることはできますが、一部だけの透過ができません。
解決法を教えていただければ幸いです。



この記事に返信する


ソラ

リンク

2020/2/21(Fri) 14:14:54|NO.89526

レイヤードウィンドウを使ってみてはどうでしょうか?



沢渡

リンク

2020/2/21(Fri) 15:51:34|NO.89527

レイヤードウィンドウですが、可能なのは「特定の色を完全に透過する」か
「ウィンドウ全体を透過度指定で半透明にする」かの二択で、
両方を同時に行うことはできないようです。
妥協策ですが、透過色で上半分をスクリーントーンのようなもので塗りつぶし、
擬似的に半透明を表現するというのはどうでしょうか。

#include "user32.as" #const WS_EX_LAYERED 0x80000 #const LWA_COLORKEY 0x1 #define ctype colorref(%1,%2,%3) ((%1) | ((%2)<<8) | ((%3)<<16)) #module //tone p1,p2,p3,p4,p5,p6 //現在の色で、スクリーントーン状の塗りつぶしを行う //p1 : 左上のx座標 //p2 : 左上のy座標 //p3 : 横幅 //p4 : 縦幅 //p5(8) : トーンの濃度。0〜16で指定。省略可能(省略時は8) //p6(1) : 0以外を指定した時は自動的にredraw 1を行う。省略可能(省略時は1) #define global tone(%1,%2,%3,%4,%5=8,%6=1) _tone %1,%2,%3,%4,%5,%6 #deffunc _tone int x,int _y,int _w,int _h,int d,int redr w=limit(_w,0) : h=limit(_h,0) //bayerマトリクス dim bayer,4,4 bayer(0,0)= 0, 8, 2,10 bayer(0,1)=12, 4,14, 6 bayer(0,2)= 3,11, 1, 9 bayer(0,3)=15, 7,13, 5 mref vram,66 //psetは遅いのでVRAMに直接書き込み b=ginfo_b : g=ginfo_g : r=ginfo_r y=ginfo_sy-(_y+h) //VRAMではy座標が上下逆になる v_wid=((ginfo_sx)*3+3)&0xFFFFFFFC repeat h,y cnt0=cnt if cnt0>=ginfo_sy : break v_bas=v_wid*cnt0 repeat w,x if cnt>=ginfo_sx : break if d>bayer(cnt\4,cnt0\4) { v_pos=v_bas+cnt*3 poke vram,v_pos,b poke vram,v_pos+1,g poke vram,v_pos+2,r } loop loop if redr : redraw 1,x,_y,w,h return #global color 0,128,0 : boxf GetWindowLong hwnd,-20 //拡張ウィンドウスタイルを取得 SetWindowLong hwnd,-20,stat|WS_EX_LAYERED //レイヤードウィンドウにする crkey=colorref(255,0,255) //透過色を指定 SetLayeredWindowAttributes hwnd,crkey,0,LWA_COLORKEY color 255,0,255 tone 0,0,640,240



とあるプログラマ

リンク

2020/2/21(Fri) 16:13:02|NO.89528

どうやらSetLayeredWindowAttributesでは「ウィンドウの一部を完全透過」もしくは「全体を半透明」にはできるものの「一部を半透明」無理そうなのですが、UpdateLayeredWindowでは可能なようです。
ただSetLayeredWindowAttributesよりも複雑な関数なため扱うのは難しそうです。

「WinAPIのUpdateLayeredWindowの使い方」
https://ja.stackoverflow.com/questions/33056/winapiのupdatelayeredwindowの使い方

こちらのスレッドではC++でウィンドウに半透明のグラデーションをかける使い方が載っていました。
VSにコピペで動かしたら機能したので技術的には可能だと思います。

なのでこちらのコードを参考にHSPでコードを組めばいけると思います。
(だいぶ時間がかかりそうなのでHSPのコードは生成していません。申し訳ないです)



ソラ

リンク

2020/2/21(Fri) 16:25:24|NO.89529

すみません、言葉足らずでした。
既にとあるプログラマさんが書いていますが、UpdateLayeredWindowでできるかと思います。
以下にHSP用のモジュールがあるのでこれを使えばHSPでも簡単に扱えるかと。
https://blog.natade.net/2008/03/20/%E3%83%AC%E3%82%A4%E3%83%A4%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6/



沢渡

リンク

2020/2/21(Fri) 17:41:52|NO.89530

なたでラボのモジュールを試してみましたが、タイトルバーやオブジェクトが表示されない模様?
タイトルバーに相当する部分に移動判定や[x]などのボタンの判定はあるようなので、
この辺りは要工夫といった感じなのでしょうか。
(質問者さんは「bgscrで」と言っているので、タイトルバー云々は問題ない?)

#include "module_lwm2.hsp" color 0,128,0 : boxf buffer 1,640,480 : gsel 1 color 255,255,255 : boxf color 127,0,0 : boxf 0,0,639,239 gsel 0 enableAlphaBlendWindow 1 button gosub "テスト",*dum stop *dum return



ᴘᴏɪᴜʏᴛʀᴇᴡ

リンク

2020/2/22(Sat) 10:39:29|NO.89536

まさかこんなに早く回答して頂けるとは思いませんでした。ありがとうございます。



ゆうやん

リンク

2020/2/24(Mon) 16:23:38|NO.89548

解決済みのようですが、一応。
dwmapi.dllのDwmExtendFrameIntoClientAreaを使えば、ウィンドウの一部の半透明化はできるみたいです。
ほかにもあるみたいですが・・・。

#uselib "dwmapi.dll" #func defica "DwmExtendFrameIntoClientArea" int, var cls 4 //黒で通常のガラス効果が得られる margins = -1, 0, 0, 0 //-1 を指定するとウィンドウ全体 defica hwnd, margins



とあるプログラマ

リンク

2020/2/24(Mon) 16:38:27|NO.89549

>>ゆうやんさん

当事者でないんであれですが、これはフレームの幅を変える関数なので少し目的とは違うような…?
というのもガラス効果とあるので恐らくゆうやんさんの環境がWindows Vistaか7だと思いますが、当方のWin10環境だとテーマの単色で塗りつぶされただけだったので…



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