アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。

VB6でメインフォーム(*.exeで起動されるフォーム)がデスクトップ内で移動したことをそのフォーム自身が知るためにはどのようにすればよいでしょうか。
目的は、移動後のフォームの位置情報の取得です。

フォームのサイズを変更した時は"Resize"イベントが発行されるので、それをきっかけにLeft,Top情報を取得できます。
同じようにフォームが移動した時にLeft,Top情報を取得する方法を知りたいです。

API等の利用で可能になるのであればそれでもかまいません。

よろしくお願いします。

A 回答 (1件)

Fromをサブクラス化して WM_MOVEメッセージを捕まえてみましょう



標準モジュールを追加して以下のコードを記述します
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
  (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, _
  ByVal Msg As Long, ByVal wParam As Long, _
  ByVal lParam As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
  (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Const GWL_WNDPROC = (-4)
Const WM_MOVE = &H3
Public lpfnProc As Long
Public nTop As Integer, nLeft As Integer

Public Function myProc(ByVal hWnd As Long, ByVal uMsg As Long, _
  ByVal wParam As Long, ByVal lParam As Long) As Long
  If uMsg = WM_MOVE Then
    Dim x As Long, y As Long
    x = Form1.Left
    y = Form1.Top
    If (x <> nLeft) Or (y <> nTop) Then
      MsgBox x - nLeft & " - " & y - nTop
      nLeft = x
      nTop = y
    End If
  End If
  myProc = CallWindowProc(lpfnProc, hWnd, uMsg, wParam, lParam)
End Function

From1のLoadイベントなどで
nTop = Me.Top
nLeft = Me.Left
lpfnProc = SetWindowLong( ME.hWnd, GWL_WNDPROC, Addressof myProc )
と記述します

いったん保存してから実行してください

サブクラス化した場合 VB6のIDEのブレークポイントによるデバッグはしないようにしてください
ブレークポイントを使うと IDEがクラッシュします
Debug.PrintやMsgBoxなどは使えますが ・・・
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2009/01/12 12:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!