【API Function】


[ウインドウ位置を得る]
 ここでいうウインドウとは、ダイアログのことだけではなく、CommandButton やTextBoxなどのコントロールも含みます。このGetWindowRect関数は、 それらのスクリーン位置やクライアント位置をPixel単位で得られる関数です。 もちろん、この関数を使用しなくても、.Left,.Topプロパティを参照すれば 同様なことが簡単に得られます。しかし、もしPixel単位でこれらの値がほしいとき、 この方法では、ウインドウの.SccaleModeプロパティをPixelにしてもフォーム の.Left,.Top,.Width,Heightプロパティの値は、常にTwip単位の値となってしまいます。 Screen.TwipsPerPixelXを使用して変換すれば、解決することができますが、 フォームの.Left,.Top,.Widthプロパティだけは、別というのはなんだか 複雑に感じます。


(GetWindowRect 関数の使用方法)

 ここで紹介しているものでは、メインウインドウのウインドウ位置をスクリーン座標, CommandButtonのクライアント位置をクライアント座標でPixel単位で得ています。
フォームのGeneralセクションに次の宣言コードを追加して下さい。

'構造体の定義
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が返る

次に、フォームにCommandButtonを2つ配置し、 Command1_Click(),Command2_Click()プロシージャに次のコードを追加します。

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

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

クライアント座標については、左上隅の座標が常に(0,0)となります。


API Functionインデックス トップ


Copyright(C)1999 Tomoya. All rights reserved.