透明・透過のテスト(T) <TOP>
SetWindowLong ウィンドウに関するデータをセット
GetWindowLong ウィンドウに関するデータを取得
SetLayeredWindowAttributes 透明なウィンドウを作成 (Windows95/98には対応していません!)
通常フォーム表示
透過度(アルファ値175)
フォーム全体が透けている
フォーム(背景色:灰色)を透明に
デスクトップアイコン等が見えている
ピクチャボックス背景色(白で)を指定し透明に
TEXTBOX、PICTUREBOX、LISTBOXが透けている
BUTTON1をSCROOL1に変え、ALPHA値を連続可変にしてみました。
'================================================================ '= 透明・透過のテスト(T) '= ※256色以下では透明なWindowは作成されない '= SetLayeredWindowAttributesはWindows95/98では不可 '= (SetLayeredWinAttri.bas) '================================================================ #include "Windows.bi" ' 指定されたウィンドウの属性を変更。また、拡張ウィンドウメモリの指定されたオフセットの32ビット値を書き換えることができる Declare Function Api_SetWindowLong& Lib "user32" Alias "SetWindowLongA" (ByVal hWnd&, ByVal nIndex&, ByVal dwNewLong&) ' 指定されたウィンドウに関しての情報を取得。また、拡張ウィンドウメモリから、指定されたオフセットにある32ビット値を取得することもできる Declare Function Api_GetWindowLong& Lib "user32" Alias "GetWindowLongA" (ByVal hWnd&, ByVal nIndex&) ' レイヤード ウィンドウの不透明および透明のカラーキーを設定 Declare Function Api_SetLayeredWindowAttributes& Lib "user32" Alias "SetLayeredWindowAttributes" (ByVal hWnd&, ByVal crKey&, ByVal bAlpha&, ByVal dwFlags&) #define GWL_EXSTYLE (-20) '拡張ウィンドウスタイル(nIndexの定数) #define LWA_COLORKEY 1 'crKeyを透明色として使う(dwFlagsの定数) #define LWA_ALPHA 2 'bAlphaをアルファー値として使う #define WS_EX_LAYERED &H80000 '透明なウィンドウ属性(Windows2000以上) Var shared Text(2) As Object Var Shared Button(2) As Object Var shared List1 As Object Var shared Picture1 As Object Var shared HScroll1 As Object Picture1.Attach GetDlgItem("Picture1") List1.Attach GetDlgItem("List1") : List1.SetFontSize 14 HScroll1.Attach GetDlgItem("HScroll1") For i = 0 To 2 Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) Text(i).SetFontSize 14 Button(i).Attach GetDlgItem("Button" & Trim$(Str$(i + 1))) Button(i).SetFontSize 14 Next Var shared hWnd As Long Var shared Alpha As Byte Var shared CrLf$ As String '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() CrLf$ = Chr$(13, 10) Text(0).SetWindowtext "" Picture1.Symbol(0, 0), "Picture", 1, 1 hWnd = GethWnd For i = 1 To 20 List1.AddString String$(40, Chr$(&H40 + i)) Next HScroll1.SetScrollRange 25, 255 HScroll1.SetScrollStep 5, 1 HScroll1.SetScrollPos 255 End Sub '================================================================ '= ウィンドウ全体を半透明にする(クリック毎に透過度を可変) '================================================================ Declare Sub HScroll1_Change edecl () Sub HScroll1_Change() Var dwStyle As Long Var Ret As Long Alpha = HScroll1.GetScrollPos '拡張ウィンドウスタイルにWS_EX_LAYEREDを追加する dwStyle = Api_GetWindowLong(hWnd, GWL_EXSTYLE) dwStyle = dwStyle Or WS_EX_LAYERED Ret = Api_SetWindowLong(hWnd, GWL_EXSTYLE, dwStyle) Ret = Api_SetLayeredWindowAttributes(hWnd, 0, Alpha, LWA_ALPHA) Text(0).SetWindowtext "Alpha値:" & Trim$(Str$(Alpha)) End Sub '================================================================ '= MainForm背景色を透明にする '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var dwStyle As Long Var Ret As Long '拡張ウィンドウスタイルにWS_EX_LAYEREDを追加する dwStyle = Api_GetWindowLong(hWnd, GWL_EXSTYLE) dwStyle = dwStyle Or WS_EX_LAYERED Ret = Api_SetWindowLong(hWnd, GWL_EXSTYLE, dwStyle) '透明色を指定して透明にする Ret = Api_SetLayeredWindowAttributes(hWnd, GetBackColor, 0, LWA_COLORKEY) Text(0).SetWindowtext "メインフォームの背景色を取得(GetBackColor)し、その色を指定して透明に・・" End Sub '================================================================ '= Picture1の背景色を透明にする '================================================================ Declare Sub Button2_on edecl () Sub Button2_on() Var dwStyle As Long Var Ret As Long '拡張ウィンドウスタイルにWS_EX_LAYEREDを追加する dwStyle = Api_GetWindowLong(hWnd, GWL_EXSTYLE) dwStyle = dwStyle Or WS_EX_LAYERED Ret = Api_SetWindowLong(hWnd, GWL_EXSTYLE, dwStyle) 'Picture1の背景色を取得し、その色を透明にする ↓ Ret = Api_SetLayeredWindowAttributes(hWnd, Picture1.GetBackColor, 0, LWA_COLORKEY) Text(0).SetWindowtext "ピクチャボックスの背景色を取得(GetBackColor)し、その色を指定して透明に・・" End Sub '================================================================ '= ウィンドウ全体を通常に戻す '================================================================ Declare Sub Button3_on edecl () Sub Button3_on() Var dwStyle As Long Var Ret As Long '拡張ウィンドウスタイルにWS_EX_LAYEREDを追加する dwStyle = API_GETWINDOWLONG&( hWnd, GWL_EXSTYLE) dwStyle = dwStyle Or WS_EX_LAYERED Ret = Api_SetWindowLong(hWnd, GWL_EXSTYLE, dwStyle) 'ウィンドウ全体を通常に戻す ↓透明度(255:通常) Ret = Api_SetLayeredWindowAttributes(hWnd, 0, 255, LWA_ALPHA) Text(0).SetWindowtext "Alpha値:" & Trim$(Str$(255)) End Sub '================================================================ '= イベント '================================================================ While 1 WaitEvent Wend Stop End