ここでいうウインドウとは、ダイアログのことだけではなく、CommandButton やTextBoxなどのコントロールも含みます。このGetWindowRect関数は、 それらのスクリーン位置やクライアント位置をPixel単位で得られる関数です。 もちろん、この関数を使用しなくても、.Left,.Topプロパティを参照すれば 同様なことが簡単に得られます。しかし、もしPixel単位でこれらの値がほしいとき、 この方法では、ウインドウの.SccaleModeプロパティをPixelにしてもフォーム の.Left,.Top,.Width,Heightプロパティの値は、常にTwip単位の値となってしまいます。 Screen.TwipsPerPixelXを使用して変換すれば、解決することができますが、 フォームの.Left,.Top,.Widthプロパティだけは、別というのはなんだか 複雑に感じます。
(GetWindowRect 関数の使用方法)
ここで紹介しているものでは、メインウインドウのウインドウ位置をスクリーン座標, CommandButtonのクライアント位置をクライアント座標でPixel単位で得ています。
フォームのGeneralセクションに次の宣言コードを追加して下さい。
次に、フォームにCommandButtonを2つ配置し、 Command1_Click(),Command2_Click()プロシージャに次のコードを追加します。
'構造体の定義 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 '---------------------引数--------------------------- '(hwnd) スクリーン位置を取得するウインドウのハンドル '(lpRect) 座標を格納する構造体 '--------------------戻り値-------------------------- '関数が成功すると0以外の値が返り '関数が失敗すると0が返る '指定ウインドウの左上隅と右下隅座標のクライアント座標を得る関数 Private Declare Function GetClientRect Lib "user32" _ (ByVal hwnd As Long, lpRect As RECT) As Long '---------------------引数--------------------------- '(hwnd) クライアント位置を取得するウインドウのハンドル '(lpRect) 座標を格納する構造体 '--------------------戻り値-------------------------- '関数が成功すると0以外の値が返り'関数が失敗すると0が返る
Private Sub Command1_Click() Dim rec As RECT Dim msg As String Call GetWindowRect(Me.hwnd, rec) msg = "左上隅座標 = " & "(" & rec.Left & "," & _ rec.Top & ")" & Chr(10) & "右下隅座標 = " & _ "(" & rec.Right & "," & rec.Bottom & ")" MsgBox msg End Subクライアント座標については、左上隅の座標が常に(0,0)となります。
Private Sub Command2_Click() Dim rec As RECT Dim msg As String Call GetWindowRect(Command2.hwnd, rec) msg = "左上隅座標 = " & "(" & rec.Left & "," _ & rec.Top & ")" & Chr(10) & "右下隅座標 = " _ & "(" & rec.Right & "," & rec.Bottom & ")" MsgBox msg End Sub