FC2ブログ

リージョン2:フォームの透明化について

リージョン2:フォームの透明化

フォームの透明化方法についてです。
但し,フォーム上のオブジェクトをそのまま残し,背景だけ透明化させます。
これを書いた当時は、結構試行錯誤しました。

'=======================================================================
'
' リージョン関連
'
'=======================================================================

'--------------------
' API宣言
'--------------------
  '---長方形のリージョン作成
    Declare Function CreateRectRgn Lib "gdi32" (ByVal x1 As Long, ByVal Y1 As Long, _
                                   ByVal x2 As Long, ByVal Y2 As Long) As Long
  '---角丸四角形のリージョン作成
    Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal x1 As Long, ByVal Y1 As Long, _
                                      ByVal x2 As Long, ByVal Y2 As Long, _
                                      ByVal Height As Long, ByVal Width As Long) As Long
  '---リージョンをウインドウにセット
    Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, _
                                   ByVal bRedraw As Boolean) As Long
  '---2つのリージョンを結合
    Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, _
                                ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
  '---オブジェクトの削除
    Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  '---システムメトリックの取得
    Declare Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As Long

  '---定数宣言
    '[定数1]
    Public Const RGN_AND = 1  '両方のリージョンの重なりあう領域
    Public Const RGN_OR = 2   '両方のリージョンのすべてを結合してリージョンを作成
    Public Const RGN_XOR = 3  '両方のリージョンを結合し、重なりあう部分だけを除去
    Public Const RGN_DIFF = 4  'リージョン1の中で、リージョン2と交わらない部分
    Public Const RGN_COPY = 5 'リージョン1のコピー

    '[定数2]
    Public Const NULLREGION = 1     '空のリージョン
    Public Const SIMPLEREGION = 2    '境界が重なっていません
    Public Const COMPLEXREGION = 3  '境界が重なっています

    '[定数3]
    Public Const SM_CXBORDER = 5  'サイズ変更できないウィンドウ枠の幅
    Public Const SM_CYBORDER = 6  'サイズ変更できないウィンドウ枠の高さ
    Public Const SM_CYCAPTION = 4 'ウィンドウ タイトルの高さ(SM_CYBORDERを含む)
    Public Const SM_CXFRAME = 32  'サイズ変更できるウィンドウ枠の幅
    Public Const SM_CYFRAME = 33  'サイズ変更できるウィンドウ枠の高さ




'---------------------------------------------------
' 利用方法(以下必要に応じてプロシージャに貼り付けて下さい。)
'---------------------------------------------------

  '---<< フォーム透明化 >>
    Dim X_Sabun
    Dim Y_Sabun

    '---システムメトリックの取得
      X_BORDER = GetSystemMetrics(SM_CXBORDER)
      Y_BORDER = GetSystemMetrics(SM_CYBORDER)
      Y_CAPTION = GetSystemMetrics(SM_CYCAPTION)
      X_FRAME = GetSystemMetrics(SM_CXFRAME)
      Y_FRAME = GetSystemMetrics(SM_CYFRAME)

    '---差分計算
      X_Sabun = X_FRAME + X_BORDER
      Y_Sabun = Y_BORDER + Y_CAPTION + Y_FRAME

    '---フォーム透明化
      With Form1
        'フォーム自体のリージョンを作成
        hRgn = CreateRectRgn(0, _
        0, _
        .Width \ Screen.TwipsPerPixelX + X_Sabun, _
        .Height \ Screen.TwipsPerPixelY + Y_Sabun)
        wRgn = CreateRectRgn(X_Sabun, _
        Y_Sabun, _
        .Width \ Screen.TwipsPerPixelX - X_Sabun, _
        .Height \ Screen.TwipsPerPixelY - Y_BORDER - Y_FRAME)
        lRet = CombineRgn(hRgn, hRgn, wRgn, RGN_DIFF)

        'フォームのオブジェクト毎のリージョンを順次作成
        For Each oObject In Form1
          'オブジェクト毎のリージョン作成
          With oObject
            wRgn = CreateRectRgn(.Left \ Screen.TwipsPerPixelX + X_Sabun, _
            .Top \ Screen.TwipsPerPixelY + Y_Sabun, _
            (.Left + .Width) \ Screen.TwipsPerPixelX + X_Sabun, _
            (.Top + .Height) \ Screen.TwipsPerPixelY + Y_Sabun)
          End With

          'フォーム自体のリージョンを結合
          lRet = CombineRgn(hRgn, hRgn, wRgn, RGN_OR)
        Next

        'リージョン設定
        lRet = SetWindowRgn(.hwnd, hRgn, True)
      End With


  '---<< フォーム透明化 >>
     '---リージョン解除
      With Form1
        Call SetWindowRgn(.hwnd, 0, True)
      End With



【宣伝・・・(*´ω`)】

タイトルロゴ3

 システム葵では、個人様向けでも企業様向けでも、パソコン修理から、パソコン設定、パソコンの使い方、LAN環境構築、ソフトウェア開発まで、様々な実績がありますので、困ったことがあれば、お気軽にご相談下さい。
関連記事

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

検索フォーム
最新記事
カテゴリ
全記事表示リンク

全ての記事を表示する

最新コメント
プロフィール

ITLife

Author:ITLife
システム葵新井聡太です。
東京都東村山市に生まれ、ここで育ち、ここで結婚し、システムエンジニア一筋で十数年やってきました。
ここでは主に、パソコンを中心にITに関わることを備忘録として残していきたいと思います。
少しでも来ていただいた方のお役に立てたら幸いです。
m(_ _)m

p.s
ここで紹介している内容は一例です。すべては、自己責任でお願いします。

カレンダー
07 | 2019/08 | 09
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
訪問数
月別アーカイブ
リンク