#662 マウスポインタの近くでフォームを開くには? フォーム、VBA

Accessのプログラムで別のフォームを開いた際、それがどの位置にどのように表示されるかは、開かれる側のフォームデザインや開き方に則ります。

タブ付きドキュメントのふつうのフォームであれば1つのタブとして開きます。デザイン上でポップアップの指定がしてあれば、ふつうに開いてもダイアログのように1つのウィンドウとして最前面に表示されます。またその指定がなくてもDoCmdのOpenFormメソッドでダイアログ指定をすればダイアログとして開きます。

またダイアログとして開かれる場合、フォームに自動中央寄せ”はい”が設定してあれば画面中央の位置に表示されますし、”いいえ”なら最後にデザインが保存された位置に表示されます。またプログラムを使って開く時点で動的に位置を移動させることもできます。

ここでは、画面上のどの位置にマウスのポインタがあったかによってダイアログの表示位置を変える方法について説明します。
具体的には、レコードが一覧表示されているフォーム上の任意の欄をダブルクリックしたとき、その欄、すなわちマウスをダブルクリックした位置の近くに別のフォームを表示させるような操作を行ってみます。

なお、この内容は『#661 フィールドにコメント機能を付けるには?』の機能拡張となっています。データシートのフォーム上のある3つのテキストボックスをダブルクリックした際に表示される「fdlgコメント編集」フォームの表示位置を、ダブルクリックしたテキストボックスの近くに設定するという操作を行っています。2つのフォームのデザインや基本動作についてはそちらを参照してください。


このような動作を行わせるには、開かれる側の「fdlgコメント編集」フォームにプログラムを記述します。「Load/読み込み時」イベントプロシージャにマウスポインタの現在位置を取得したりそれに合わせてフォームの位置を変更したりするコードを記述します。それによって実際にはユーザーにフォームが見えるようになる前に移動されますので、ユーザーからはあたかも初めからその位置に開いたように見えます。

そのプログラムのコード例は次のようなものです。
ここでは、マウスポインタ位置の取得、フォームのウィンドウ位置の移動をWindows APIで行っています。そのため、まず「Declarationsセクション」にWindows APIに関する宣言を記述しています。
そして、「Load/読み込み時」イベントプロシージャにそれらの関数を使ってポインタ位置の取得・フォーム位置の設定を行うコードを記述しています。

Option Compare Database
Option Explicit

'Windows APIの宣言
Private Type POINT
  X As Long
  Y As Long
End Type
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINT) As Long

Private Type RECT
  Left   As Long
  Top    As Long
  Right  As Long
  Bottom As Long
End Type
Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, _
                                           lpRect As RECT) As Long
Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal X As Long, _
                            ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, _
                            ByVal bRepaint As Long) As Long


Private Sub Form_Load()
'フォーム読み込み時

  Dim Mp As POINT
  Dim MeRect As RECT
  Dim lngLeft As Long
  Dim lngTop As Long
  Dim lngWidth As Long
  Dim lngHeight As Long

  'マウスポインタの位置を取得
  GetCursorPos Mp

  'このフォームのウィンドウ情報を取得
  GetWindowRect Me.hwnd, MeRect

  'このフォームをポインタ周辺に移動
  With MeRect
    lngWidth = .Right - .Left
    lngHeight = .Bottom - .Top
    lngLeft = Mp.X - (lngWidth \ 2) + 130   'この130は適当に調整
    lngTop = Mp.Y - (lngHeight \ 2) + 70    'この70は適当に調整
  End With
  MoveWindow Me.hwnd, lngLeft, lngTop, lngWidth, lngHeight, 1

End Sub


上記のコードにおいて「'この130は適当に調整」といったコメントがありますが、ここに指定する数値は、より細かくマウスポインタとフォームの位置関係を微調整するためのものです。たとえば、
  • 「+130」「+70」の部分をともに「+0」にした場合または省略した場合は、ポインタ位置にフォームの中心が来るように配置されます
  • ともにマイナス値を指定した場合は、ポインタの左上寄りにフォームが配置されます
  • lngLeftの方を「+150」、lngTopの方を「-100」のようにした場合は、ポインタの右上にフォームが配置されます
  • 上記のサンプルではともにプラス値を指定しているので、ポインタの右下にフォームが配置されます
  • また、適当な値を加減算するのではなく、「lngLeft = Mp.X - lngWidth」や「lngLeft = Mp.X」といったように指定することで、ポインタ位置にフォームの右下や左上をピッタリと合わせることもできます

実行例:(それぞれ矢印がマウスをダブルクリックした欄を表しています)





関連Tips:
   #661 フィールドにコメント機能を付けるには?
| Index | Prev | Next |



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