将等待光标定位在组框内的按钮上


使用 VB 2008 Express。
我有一个主窗体,其中有许多组框。

根据需要,我可以使用以下代码行成功地将等待光标定位在主窗体上不在组框中的控件上:(假设 Button1 不在组框中)

Cursor.Position = PointToScreen(Button1.Location)
光标 = Cursors.WaitCursor
应用程序.DoEvents()

但是,如果 Button1 位于 Group Box(例如 GroupBox1)内,我还没有发现如何将光标移到该按钮上。 相反,它被放置在主窗体上不在 GroupBox1 内的其他位置。

我尝试过以下变体但没有成功:

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

没有产生错误,但没有获得期望的结果。
我相信这与组框中按钮的位置属性相对于组框左上角有关。 但 VB 将光标定位为按钮的位置属性相对于主窗体的左上角。
希望得到指导 – 谢谢,迈克

我尝试过的:

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

解决方案1

控件的位置始终相对于其容器:如果窗体上有一个 GroupBox,并且 GroupBox 包含一个 Button,则 myGroupBox.Location 相对于 myForm.ClientRectangle 的左上角,而 myButton.Location 是相对的到 myGroupBox.ClientRectangle 的左上角。

因此,要确定 myButton 相对于 myForm 的位置,您需要将 myButton.Location 添加到 myGroupBox.Location – 结果相对于 Form.ClientArea 的左上角。 然后,您可以使用 PointToScreen 来确定它相对于实际显示器左上角的位置。

合理?

解决方案3

感谢 OriginalGriff 和 Ralf Meier…

他们的指导引导我找到了下面粘贴的解决方案。
但首先,我需要澄清我最初发布的场景。 似乎下面的代码行 将要 如果在此过程中没有打开其他表单(例如 Filedialog 窗口),则可以工作。

Cursor.Position = PointToScreen(Button1.Location)

但是,如果在此过程中打开另一个窗体,即使它在 Cursor.Position 语句之前,光标位置也不会正确定位到组框中的 button1 位置。
可能有一种更简单的方法可以从打开的窗口恢复方向,以便代码行可以工作,但我还没有找到。

结果,我制定了以下解决方案(注意:我是一名业余爱好者,因此可能有更正确的编码方法):

在类声明中添加了以下内容:

Dim WaitCurPt As New Point(0, 0)

在我想要设置光标位置的代码中,添加了以下内容,其中使用了所需的 Groupbox 和 Button 的实际名称(名称周围没有任何引号):

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

コメント

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