tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルマウスカーソルの滑らか移動
記事No14152
投稿日: 2009/10/10(Sat) 04:44
投稿者NIL
ダイアログなどが表示された際に、
マウスカーソルを指定位置に移動させるような機能を作りたいと思っています。

setcursorposで実現できるのですが、できれば現位置から指定位置まで移動してゆくのが
目で見てわかるようにしたいと思っています

setcursorposを何度も呼び出すという方法をやったのですが、
一瞬で移動します、Doeventを挟んでも一瞬でした。

何か良い実現方法はありませんでしょうか?
環境はVB6 Sp6、OSはVistaです
よろしくお願い致します。

[ツリー表示へ]
タイトルRe: マウスカーソルの滑らか移動
記事No14154
投稿日: 2009/10/10(Sat) 18:56
投稿者オショウ
> ダイアログなどが表示された際に、
> setcursorposを何度も呼び出すという方法をやったのですが、
> 一瞬で移動します、Doeventを挟んでも一瞬でした。

  プログラムの組み方に細工が必要かもしれませんが・・・
  DoEventの前後にWin32 API の、Sleep() を入れてみて
  下さい。

  Sleepする時間は、100〜200くらいかナ〜

※ この方法だと、マウスカーソルはゆっくり動くようになりますが
  マウスの移動が終わらない限り、他の機能動けないので・・・

※ VISTAでまだ確かにVB6動きますが・・・
  .NETにしたら?

以上。

[ツリー表示へ]
タイトルRe^2: マウスカーソルの滑らか移動
記事No14155
投稿日: 2009/10/11(Sun) 00:55
投稿者NIL
お返事ありがとうございます

.Netにするとこの質問が解消するのでしょうか?
何か別の方法があるということでしょうか?

[ツリー表示へ]
タイトルRe^3: マウスカーソルの滑らか移動
記事No14156
投稿日: 2009/10/11(Sun) 08:08
投稿者オショウ
> .Netにするとこの質問が解消するのでしょうか?
> 何か別の方法があるということでしょうか?

  マルチスレッドのプログラムが書けるようになりますし
  ThreadクラスにSleepありますので、SleepをDeclareしな
  いで使えます。

  VisualStudio.NETも2002/2003/2005/2008と変遷してきて
  もうすぐ2010が出ます。
  VB6は、もうサービスパックも出ない状況。

  もう後が無いので、.NETに移行すべきかと。

以上。

[ツリー表示へ]
タイトルRe: マウスカーソルの滑らか移動
記事No14157
投稿日: 2009/10/11(Sun) 08:42
投稿者花ちゃん
> ダイアログなどが表示された際に、マウスカーソルを指定位置に移動
問題は、こちらの方じゃないでしょうか?
どのようなダイアログなのでしょうか?

例えば、同じフォーム内のCommand1 から Command2 のボタンにゆっくり移動表示
させるのは、まだ簡単で、.NET でも手法はあまり変わらないと思うのですが、
(上記でも70行以上のコードが必要)

[名前を付けて保存]等のようなダイアログボックスなら、指定位置を求めるだけでも
大変で、下記のようなコードをどこに書いて実行させますか?
(指定位置と言っても色々あり、閉じるボタン上や枠線上やスクロールバー上とか)
何の為にそのような仕様が必要かは知りませんが、かなり高度な技法や大量のコードが
必要になるように思いますよ。(.NET でも多分同様かと)

> setcursorposを何度も呼び出すという方法をやったのですが、
> 一瞬で移動します、Doeventを挟んでも一瞬でした。

※ 最近は、DoEvents 関数や Sleep 関数は、色々問題があると言われておりますので、
できれば使用されない方が無難かと思います。

[ツリー表示へ]
タイトルRe^2: マウスカーソルの滑らか移動
記事No14159
投稿日: 2009/10/11(Sun) 15:13
投稿者NIL
お返事ありがとうございます。

自分が呼び出すダイアログの画面に移動させるだけなので、
その部分はもう完成してます。

同じフォーム内のCommand1 から Command2 のボタンにゆっくり移動表示
の方法をご教授していただけると嬉しいです。
よろしくお願い致します。

DoEvents 関数や Sleep 関数の問題とはどういったことでしょうか?
これも教えていただけると勉強になります

[ツリー表示へ]
タイトルRe^3: マウスカーソルの滑らか移動
記事No14160
投稿日: 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

[ツリー表示へ]