【解決方法】グループボックス内のボタン上に待機カーソルを配置します。


VB2008Expressを使用しています。
いくつかのグループ ボックスを持つメイン フォームがあります。

希望どおり、次のコード行を使用して、グループ ボックス内にないメイン フォーム上のコントロールに待機カーソルを正常に配置できます。 (Button1 がグループ ボックス内にないものと仮定します)。

Cursor.Position = PointToScreen(Button1.Location)
カーソル = Cursors.WaitCursor
Application.DoEvents()

しかし、Button1 がグループ ボックス (例: GroupBox1) 内に配置されている場合、そのボタン上にカーソルを置く方法がわかりません。 代わりに、GroupBox1 内ではないメイン フォーム上の他の場所に配置されます。

次のバリエーションを試しましたが成功しませんでした。

Cursor.Position = PointToScreen(Button1.Location)、および
Cursor.Position = PointToScreen(GroupBox1.Button1.Location)

エラーは発生しませんが、期待した結果が得られません。
これは、グループ ボックス内のボタンの位置プロパティがグループ ボックスの左上隅を基準にしているという事実に関係していると思います。 ただし、VB は、ボタンの location プロパティがメイン フォームの左上隅を基準にしているかのようにカーソルを配置します。
ご指導いただければ幸いです – ありがとう、マイク

私が試したこと:

Cursor.Position = PointToScreen(Button1.Location), and
Cursor.Position = PointToScreen(GroupBox1.Button1.Location)

解決策 1

コントロールの場所は常にそのコンテナに対して相対的です。フォーム上に GroupBox があり、GroupBox に Button が含まれている場合、myGroupBox.Location は myForm.ClientRectangle の左上隅に対して相対的であり、myButton.Location は相対的です。 myGroupBox.ClientRectangle の左上隅に追加します。

したがって、myForm を基準にして myButton の位置を特定するには、myButton.Location を myGroupBox.Location に追加する必要があります。結果は Form.ClientArea の左上隅を基準にしています。 次に、PointToScreen を使用して、実際のモニターの左上隅からの相対位置を特定できます。

意味をなす?

解決策 3

OriginalGriff と Ralf Meier に感謝します。

彼らの指導により、私は以下に貼り付けた解決策にたどり着きました。
しかしその前に、最初に投稿したシナリオを明確にする必要があります。 以下のコード行のようです 意思 たとえば、ファイルダイアログウィンドウなど、プロセス中に他のフォームが開かれていない場合に機能します。

Cursor.Position = PointToScreen(Button1.Location)

ただし、プロセス中に別のフォームが開かれる場合、それが Cursor.Position ステートメントの前であっても、カーソル位置はグループボックス内の button1 の位置に正しく配置されません。
コード行が機能するように、開いたウィンドウから方向を戻すもっと簡単な方法があるかもしれませんが、私はそれを見つけませんでした。

その結果、次の解決策を考え出しました (注: 私は愛好家なので、これをコーディングするより正確な方法がある可能性があります)。

クラスステートメントに次の内容が追加されました。

Dim WaitCurPt As New Point(0, 0)

カーソル位置を設定したいコードには、目的のグループボックスとボタンの実際の名前が使用されている以下のコードが追加されました (名前の前後に引用符はありません)。

Call WaitCursorPoint(GroupBox1, Button1)
Cursor.Position = PointToScreen(WaitCurPt)
Cursor = Cursors.WaitCursor
Application.DoEvents()

最後に、次のサブルーチンが追加されました。

Private Sub WaitCursorPoint(ByVal grp As Object, ByVal Obj As Button)
    Dim x, y As Integer
    x = grp.Location.X
    y = grp.Location.Y
    x = x + Obj.Location.X
    y = y + Obj.Location.Y
    x = x + Obj.Size.Width / 2
    y = y + Obj.Size.Height / 2
    WaitCurPt.X = x
    WaitCurPt.Y = y
End Sub

解決策 2

オリジナルハンドル、
それは完全に理にかなっていて、私が考えていたことと一致しています。

ただし、コードでそれを実現する方法がわかりません。
例を挙げてもらえますか?
ありがとう。

コメント

タイトルとURLをコピーしました