#351 透けるフォームの作り方 フォーム、API

あまり実用性があるとはいえませんが、Accessのフォームの一部をくり抜いて、背景が透けて見えるフォームの作り方を紹介します。
ここでは「リージョン」を操作するWindows APIを用いて、ある領域をくり抜きます。リージョンとはいくつかの点から構成される領域のことで、くり抜きや塗りつぶしなどの設定、あるいは領域の判定に使ったりするものです。

透けるフォームを作るには、次のようなコードをそのフォームのモジュールに記述します。

Option Compare Database
Option Explicit
  
Private Declare Function CreateRectRgn Lib "GDI32" _
    (ByVal X1 As Long, ByVal Y1 As Long, _
      ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CombineRgn Lib "GDI32" _
    (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, _
      ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Private Declare Function SetWindowRgn Lib "USER32" _
    (ByVal hWnd As Long, ByVal hRgn As Long, _
      ByVal bRedraw As Long) As Long
Private Declare Function DeleteObject Lib "GDI32" _
    (ByVal hObject As Long) As Long

Private Const RGN_AND = 1
Private Const RGN_OR = 2
Private Const RGN_XOR = 3
Private Const RGN_DIFF = 4
Private Const RGN_COPY = 5

Private Sub Form_Load()
'フォーム読み込み時
  
  Dim lngFrmRgnhWnd As Long
  Dim lngRgnhWnd As Long
  Dim lngCombineRgn As Long

  'フォーム全体のリージョンを作成
  lngFrmRgnhWnd = CreateRectRgn(0, 0, Me.InsideWidth / 12, Me.InsideHeight / 12)
  '四角形のリージョンを作成
  lngRgnhWnd = CreateRectRgn(50, 50, 230, 200)
  '描画用リージョンを作成
  lngCombineRgn = CreateRectRgn(0, 0, 0, 0)
  'リージョンを結合(フォームから四角形エリアをくり抜き)
  CombineRgn lngCombineRgn, lngFrmRgnhWnd, lngRgnhWnd, RGN_DIFF
  'リージョンを再描画
  SetWindowRgn Me.hWnd, lngCombineRgn, True
  'リージョンの削除
  DeleteObject lngFrmRgnhWnd
  DeleteObject lngRgnhWnd
  DeleteObject lngCombineRgn
        
End Sub


実行画面:
データベースウィンドウが透けて見えます


※ここでは(知識不足もあって)かなり簡便な方法で例示しています。"こんなこともできる"といった程度のサンプルとしてご覧ください。
  • CreateRectRgn関数に指定する値はピクセル値です。ここでは適当な値として1ピクセル=12Twipsとして計算しています。本来はこれもAPIの何らかの関数を使って厳密に求めるようです。
  • くり抜く四角形の位置とサイズも適当です。ここで指定されている値も単位はピクセルですが、厳密に指定する場合、たとえば四角形コントロールを配置してその中をくり抜きたいといった場合には、タイトルバーの高さやウィンドウ枠の幅なども考慮して値を設定しなければなりません。
  • これを実行するとウィンドウのスタイルがWindows2000以前の形式になってしまいます。理由は不明です。
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved