Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


7270 / 13645 ツリー ←次へ | 前へ→

【39104】フォーム上にマウスが来たらActiveにしたい 西谷 さくら 06/6/17(土) 22:30 質問[未読]
【39213】Re:フォーム上にマウスが来たらActiveに... 漂流民 06/6/19(月) 21:52 発言[未読]
【39217】Re:フォーム上にマウスが来たらActiveにし... bykin 06/6/19(月) 22:09 回答[未読]
【40216】Re:フォーム上にマウスが来たらActiveにし... 西谷 さくら 06/7/9(日) 10:56 お礼[未読]

【39104】フォーム上にマウスが来たらActiveにした...
質問  西谷 さくら  - 06/6/17(土) 22:30 -

引用なし
パスワード
   使用環境:WindowsXP,Excel2000

UserForm1 上に小さい UserForm2 を作ってあり、UserForm1 がActiveなとき、当然ですが、UserForm2 は非Activeでくすんだ色になっています。ユーザーがマウスカーソルをそのUserForm2の上にかざしたとき、UserForm2をActiveにする方法(クリックしないで)はあるでしょうか?

【39213】Re:フォーム上にマウスが来たらActiveに...
発言  漂流民  - 06/6/19(月) 21:52 -

引用なし
パスワード
   ▼西谷 さくら さん:
こんばんわ

>使用環境:WindowsXP,Excel2000
>
>UserForm1 上に小さい UserForm2 を作ってあり、
>UserForm1 がActiveなとき、当然ですが、
>UserForm2 は非Activeでくすんだ色になっています。
”当然ですが”、通常その様にはなりません。
ならないから貴方は[#38827]で質問をしたのでは?
実際どのよーにしてこれをやっているのかをサンプルコードとして
載せないと他の回答者も答えようがありませんよ。

>ユーザーがマウスカーソルをそのUserForm2の上にかざしたとき、
>UserForm2をActiveにする方法(クリックしないで)はあるでしょうか?
コードがないので何とも・・・ですが、
UserForm_MouseMoveイベントを使えば良いかと・・・?!

【39217】Re:フォーム上にマウスが来たらActiveに...
回答  bykin  - 06/6/19(月) 22:09 -

引用なし
パスワード
   こんばんわ。

↓これの続きってことなんかな?
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=39008;id=excel

ま、出来へんことはないんやけど・・・

(標準モジュール)------------------------------------------------------------------------

Public Declare Function GetForegroundWindow Lib "user32" () As Long

Public Declare Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long

Public Declare Function GetActiveWindow Lib "user32" () As Long

Public Declare Function SetWindowPos Lib "user32" _
            (ByVal hWnd As Long, _
            ByVal hWndInsertAfter As Long, _
            ByVal X As Long, _
            ByVal Y As Long, _
            ByVal cx As Long, _
            ByVal cy As Long, _
            ByVal wFlags As Long) As Long

Public Declare Function FindWindow Lib "user32" _
            Alias "FindWindowA" _
            (ByVal lpszClassName As String, _
            ByVal lpszWindow As String) As Long

Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOACTIVATE = &H10

Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2

Public Flg As Boolean

Public Sub test()
  Flg = False
  UserForm1.Show vbModeless
End Sub

Public Sub SetTopMost()
  Dim hWnd As Long
  hWnd = FindWindow("ThunderDFrame", UserForm2.Caption)
  SetWindowPos hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOACTIVATE
End Sub

Public Sub ActivateForm(ByRef FormCaption As String)
  Dim hWnd As Long
  
  hWnd = FindWindow("ThunderDFrame", FormCaption)
  If hWnd <> GetForegroundWindow() Then
    SetForegroundWindow hWnd
  End If
End Sub

(UserForm1)-------------------------------------------------------------------------------

Private Sub CommandButton1_Click()
  Flg = True
  UserForm2.Show vbModeless
End Sub

Private Sub CommandButton1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  ActivateForm Me.Caption
End Sub

Private Sub UserForm_Activate()
  If Flg Then SetTopMost
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  ActivateForm Me.Caption
End Sub

Private Sub UserForm_Terminate()
  Unload UserForm2
End Sub

(UserForm2)-------------------------------------------------------------------------------

Private Sub UserForm_Activate()
  Dim hWnd As Long
  hWnd = GetActiveWindow()
  SetWindowPos hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
End Sub

Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  ActivateForm Me.Caption
End Sub

Private Sub UserForm_Terminate()
  Flg = False
End Sub

但し、実際はユーザーフォーム上にあるすべてのコントロールのMouseMoveイベントで
ActivateForm Me.Captionを実行する必要があります。

それに、試したみたらわかると思うけど、ちかちかしてそんなにええもんとちゃいまっせ。
ま、お好みでっけど・・・

ほな。

【40216】Re:フォーム上にマウスが来たらActiveに...
お礼  西谷 さくら  - 06/7/9(日) 10:56 -

引用なし
パスワード
   ▼bykin さん:
できました!済みません遅れて。。
2−3日返答を見ていたのですが、来なかったので
あきらめてしまって、それ以来、見ていませんでした。
済みません。
この回答を頂いて、前のAPIの部分を数回練習して
頭にもぅ1度入れてから、新しい部分GetForegroundWindow
Form_MouseMove などを理解してトライしたところ、
うまく動きました。
Form は UserFor1と UserForm2 しかないので、
Form のMouseMove だけを使いました。Form1上の
コントロールは100以上あり、Form2上のコントロール
も10個あるので、コントロールのMouseMoveは使いませんでした。
というよりも、UserForm1,2上のコントロールは自分が
のっているUserFormがActiveかどうかにかかわらず、
作動するのでコントロール類のMouseMoveによる
Activateは不要のようです。
コンテナーのUserFormがActiveでないのに、その上の
コントロール類が動いてしまうのは便利なようで
気持ち悪い気もしますけど。。。
とにかく、Form間でマウスを移動するとちゃんと
Activeになりました。ありがとうございました。

7270 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free