ウィンドウを半透明にする

Windows2000以降限定ですがウィンドウを半透明にすることができます。

※Windows9X系(Meも含む)ではSetLayeredWindowAttributes関数を実装していないので実行できません。

サンプル(32bit) ダウンロード

'ウィンドウ属性関連API
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
'半透明化API(Windows2000以降のみ有効)
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Long, ByVal dwFlags As Long) As Long

Private Const WS_EX_LAYERED = &H80000
Private Const LWA_COLORKEY = &H1
Private Const LWA_ALPHA = &H2
Private Const GWL_EXSTYLE = (-20)


Private Sub Form_Load()

    Dim nIndex As Long
    
    'ウィンドウ属性の変更
    '****[ 既存の拡張ウィンドウ属性を取得
    nIndex = GetWindowLong(Me.hWnd, GWL_EXSTYLE)
    '****[ 拡張ウィンドウ属性に半透明にする事を設定
    Call SetWindowLong(Me.hWnd, GWL_EXSTYLE, nIndex Or WS_EX_LAYERED)
    
    ' とりあえずウィンドウ描画
    Call HScroll1_Change
    
End Sub

Private Sub HScroll1_Change()
    
    Dim lngAlpha As Long
    
    Me.Caption = "透明度:" & CStr(HScroll1.Value) & "%"
    
    '透明度の算出
    lngAlpha = 255 - (255 * (HScroll1.Value / 100))
    
    'ウインドウ半透明化
    Call SetLayeredWindowAttributes(Me.hWnd, 0, lngAlpha, LWA_ALPHA)

End Sub

サンプル解説

ウィンドウの透明化は以下の手順で行います。

  1. GetWindowLong関数で既存の拡張ウィンドウ属性を取得。
  2. 取得した拡張ウィンドウ属性に半透明属性を加えてSetWindowLong関数で拡張ウィンドウ属性を設定。
  3. SetLayeredWindowAttributes関数でウィンドウの描画。

GetWindowLong関数・SetWindowLong関数の説明は「フリガナの取得」で使用しましたので割愛します。
「フリガナの取得」はウィンドウプロシージャの書き換えだったんですが、今回は拡張ウィンドウ属性に半透明(レイヤ)属性を加えて「このウィンドウは半透明にする」と宣言しています。

そして、SetLayeredWindowAttributes関数で半透明化したウィンドウを描画します。

引数は次の通りです。
(引数の名前は、Declare Functionで指定したものです)

メンバー I/O 説明
hWnd In ウィンドウのハンドル
サンプルでは半透明化するウィンドウのハンドルをセットしています。
crKey In 透明化する色
bAlpha In 透明度
0(透明)〜255(不透明)まで256段階で設定できます。
dwFlags In 動作フラグ
  • LWA_COLORKEY : crKeyを使用
  • LWA_ALPHA : bAlphaを使用

透明化する対象の設定です。
LWA_COLORKEYの場合は、crKeyに設定した色を透明にしてウィンドウを描画します。
LWA_ALPHAの場合は、bAlphaに設定した透明度でウィンドウを半透明に描画します。

SetLayeredWindowAttributes関数は、かなりの負荷になります。
あまりにも大きいサイズのウィンドウを半透明化するとパフォーマンスに著しい影響を与える場合があるので注意してください。


[ Window Close ]