4

我有一个小问题。我将光标设置为等待状态。调用 PrintDialog 后,光标返回默认状态。我无法再次将光标设置为等待状态。代码是这样的:

Cursor.Current = Cursors.WaitCursor
[...]
Dim result As DialogResult = printDialog.ShowDialog()
If result = DialogResult.Cancel Then
    Return
End If
Cursor.Current = Cursors.WaitCursor
[...]
4

1 回答 1

2

我只是用你的代码做了一个小测试。使用您的代码时,我的 VS2012 没有出现,Cursor.Current但在使用时没有抛出任何异常。所以我把它改成了

Me.Cursor = Cursors.WaitCursor

Dim result As DialogResult = printDialog.ShowDialog()
If result = DialogResult.Cancel Then
    Return
End If
' not necesary any more
'Cursor.Current = Cursors.WaitCursor

并且WaitCursor在显示 printDialog 后保持不变。

编辑:找到了一个很好的解释Cursor.Current 和 Cursor之间的区别

EDIT2:我更改了代码以使用上述@HansPassant 示例中的 HourGlass 类。即使您输入文本框,WaitCursor 现在也会保留。无论如何 - 当悬停在例如边界上时,我仍然能够丢失 waitCursor。一个文本框。

总而言之,IMO 我认为当仍然可以输入文本时强制等待光标不是很好。也许您可以考虑禁用控件,直到某种操作完成,然后再将光标变回。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Hourglass.Enabled = True

    Dim result As DialogResult = PrintDialog1.ShowDialog()
    If result = Windows.Forms.DialogResult.Cancel Then
        Return
    End If

    'Cursor.Current = Cursors.WaitCursor
End Sub

Hourglass.vb - 我希望我在将其转换为 vb.net 时没有犯任何错误

Public Class Hourglass
  Implements IDisposable

  Public Shared Property Enabled As Boolean
    Get
        Return Application.UseWaitCursor
    End Get
    Set(ByVal value As Boolean)
        If value = Application.UseWaitCursor Then Return
        Application.UseWaitCursor = value
        Dim f As Form = Form.ActiveForm
        If Not f Is Nothing AndAlso f.Handle <> IntPtr.Zero Then
            SendMessage(f.Handle, 32, f.Handle, 1)
        End If
    End Set
  End Property

  <System.Runtime.InteropServices.DllImport("user32.dll")>
  Private Shared Function SendMessage(hWnd As IntPtr, msg As IntPtr, wp As IntPtr, lp As IntPtr) As IntPtr
  End Function

  Public Sub Dispose() Implements IDisposable.Dispose
    Enabled = False
  End Sub
End Class
于 2013-01-28T09:28:42.783 回答