tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re^3: マウスカーソルの滑らか移動
投稿日: 2009/10/11(Sun) 17:08
投稿者花ちゃん
> 同じフォーム内のCommand1 から Command2 のボタンにゆっくり移動表示
> の方法をご教授していただけると嬉しいです。
何の為にどのような場面で(条件)使用するか解らないと上記のコードを投稿しても
役に立たないかも。
取り敢えず、動作確認だけのテスト用として。
Form に Command1 と Command2 と Timer1 コントロールを貼り付け、下記コードを
ペーストして下さい。

Option Explicit
Private Declare Function SetCursorPos Lib "user32" _
   (ByVal x As Long, ByVal y As Long) As Long
Private Declare Function GetCursorPos Lib "user32" _
   (lpPoint As POINTAPI) As Long
Private Type POINTAPI
   x As Long
   y As Long
End Type
Private Declare Function GetSystemMetrics Lib "user32.dll" _
   (ByVal nIndex As Integer) As Integer
Private Const SM_CXFRAME = 32       'サイズ可変ウィンドウの境界線のX方向の幅
Private Const SM_CYFRAME = 33       '  同、Y方向の幅

Private FrameWidth                  'ウィンドウの境界線のX方向の幅
Private FrameHight                  'ウィンドウの境界線のY方向の幅

Private x1 As Long
Private y1 As Long
Private x2 As Long
Private y2 As Long
Private x3 As Single
Private y3 As Single
Private N1 As Long
Private Sub Command1_Click()
   'フォームの枠の寸法を求める
   FrameWidth = GetSystemMetrics(SM_CXFRAME)
   FrameHight = GetSystemMetrics(SM_CYFRAME)

   Dim CPos As POINTAPI
   Call GetCursorPos(CPos)
   x1 = CPos.x '現在位置
   y1 = CPos.y
   N1 = 0
   '移動先(Command2のボタンの真ん中の位置を求める)
   '横方向
   x2 = Form1.Left + Command2.Left + (Command2.Width \ 2)
   x2 = (x2 \ Screen.TwipsPerPixelX) + FrameWidth
   '縦方向
   y2 = Form1.Top + Command2.Top + (Command1.Height \ 2)
   'タイトルバー及びメニューバーの寸法を求める
   y2 = y2 + (Form1.Height - Form1.ScaleHeight)
   y2 = (y2 \ Screen.TwipsPerPixelY) - FrameHight
   '1回の移動量
   x3 = (x2 - x1) / 100
   y3 = (y2 - y1) / 100
   Timer1.Interval = 20
   Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
   '**** マウスを動かした場合は解除する ********
   Dim CPos As POINTAPI
   Call GetCursorPos(CPos)
   Dim x As Long
   Dim y As Long
   x = CPos.x '現在位置
   y = CPos.y
   If x <> CLng(x1 + (x3 * N1)) Then
      Timer1.Interval = 0
      Timer1.Enabled = False
   End If
   '---------------------------------------------------
   N1 = N1 + 1
   Call SetCursorPos(x1 + (x3 * N1), y1 + (y3 * N1))
   If N1 > 100 Then
      Timer1.Interval = 0
      Timer1.Enabled = False
   End If
End Sub



> DoEvents 関数や Sleep 関数の問題とはどういったことでしょうか?
> これも教えていただけると勉強になります
関数名で検索すれば見つかるかと。
http://tinyurl.com/yz6agn6
http://msdn.microsoft.com/ja-jp/library/cc429358.aspx

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。