У меня возникают проблемы с изменением курсора мыши во время события перемещения мыши, когда левая кнопка мыши = левая кнопка мыши.
На изображении gif в текстовом поле «Координаты управления текстом» вы можете видеть, что я обновляю это текстовое поле записью того, до чего должен обновляться курсор. Это последняя запись в поле внизу. Курсор установлен на «SizeAll», однако, когда я перемещаю элемент управления с помощью левой кнопки мыши, у меня есть код для установки курсора управления на «Руку». Текстовое поле показывает, что логика корректно обновляет курсор до «руки». Проблема в том, что курсор обновляется только после того, как я отпускаю левую кнопку мыши. Так происходит до тех пор, пока я снова не начну двигать мышь и снова не вступит в силу событие MouseMove.
Private Sub ClsTextObj_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
' Get object under cursor when user moved mouse - MouseMove
' We are only going to perform the WORK if the object is TypeOf clsTextObj
If TypeOf sender Is clsTextObj Then
Dim txt_clsText_ctrl_tmp = DirectCast(sender, clsTextObj)
'Declare Bool to determine if Left Mouse Button is being used
Dim IsMouseLeftButton = e.Button = Windows.Forms.MouseButtons.Left
Dim mCursor As Cursor
Dim MouseCursor = "Logic Never Reached"
'Set mCursor var to the hand cursor when the LEFT Mouse Button is being used
If IsMouseLeftButton Then
MouseCursor = "Hand"
mCursor = Cursors.Hand
Else
MouseCursor = "SizeAll"
mCursor = Cursors.SizeAll
End If
'START Determine Mouse Cursor - Find where the mouse cursor is within the control
Dim MouseIsInLeftEdge As Boolean
Dim MouseIsInRightEdge As Boolean
Dim MouseIsInTopEdge As Boolean
Dim MouseIsInBottomEdge As Boolean
MouseIsInLeftEdge = Math.Abs(e.X) <= 9
MouseIsInRightEdge = Math.Abs(e.X - txt_clsText_ctrl_tmp.Width) <= 9
MouseIsInTopEdge = Math.Abs(e.Y) <= 9
MouseIsInBottomEdge = Math.Abs(e.Y - txt_clsText_ctrl_tmp.Height) <= 9
If MouseIsInLeftEdge Then
If MouseIsInTopEdge Then
txt_clsText_ctrl_tmp.Appearance.Cursor = Cursors.SizeNWSE
ElseIf MouseIsInBottomEdge Then
txt_clsText_ctrl_tmp.Appearance.Cursor = Cursors.SizeNESW
Else
txt_clsText_ctrl_tmp.Appearance.Cursor = Cursors.SizeWE
End If
ElseIf MouseIsInRightEdge Then
If MouseIsInTopEdge Then
txt_clsText_ctrl_tmp.Appearance.Cursor = Cursors.SizeNESW
ElseIf MouseIsInBottomEdge Then
txt_clsText_ctrl_tmp.Appearance.Cursor = Cursors.SizeNWSE
Else
txt_clsText_ctrl_tmp.Appearance.Cursor = Cursors.SizeWE
End If
ElseIf (MouseIsInTopEdge Or MouseIsInBottomEdge) Then
txt_clsText_ctrl_tmp.Appearance.Cursor = Cursors.SizeNS
Else
txt_clsText_ctrl_tmp.Appearance.Cursor = mCursor
'txt_clsText_ctrl_tmp.Appearance.Cursor = Cursor.SizeAll
End If
'END Determining Mouse Cursor
'Capture Mouse Down Clicks while moving mouse cursor. Mouse Move overrides Mouse Down basically and so we capture mouse down buttons while moving here
'If e.Button = Windows.Forms.MouseButtons.Left Then
If IsMouseLeftButton Then
txt_clsText_ctrl.Appearance.Cursor = Cursors.Hand
txt_clsText_ctrl.Location = New Point(txt_clsText_ctrl.Location.X + (e.X - initialClickLocation.X), txt_clsText_ctrl.Location.Y + (e.Y - initialClickLocation.Y))
End If
'Output mouse details
ClsTextObj1.Value = "X: " & txt_clsText_ctrl_tmp.Location.X + e.X _
& ",Y: " & txt_clsText_ctrl_tmp.Location.Y + e.Y
'Build User output info
builder.Clear()
builder.Append("Control Name: " & txt_clsText_ctrl_tmp.Name).AppendLine()
builder.Append("e.X " & e.X & ", e.Y: " & e.Y).AppendLine()
builder.Append("e.Point Location: " & e.Location.ToString()).AppendLine()
builder.Append("txt_clsText_ctrl Point Location: " & txt_clsText_ctrl_tmp.Location.ToString()).AppendLine()
builder.Append("Form Location: {X=" & txt_clsText_ctrl_tmp.Location.X + e.X)
builder.Append(",Y=" & txt_clsText_ctrl_tmp.Location.Y + e.Y & "}").AppendLine()
builder.Append("initial Ctrl Location: " & initialCtrlLocation.ToString()).AppendLine()
builder.Append("initial Click Location: " & initialClickLocation.ToString()).AppendLine()
builder.Append("Calc Point: " & "X: " & (e.X - initialClickLocation.X))
builder.Append(",Y: " & (e.Y - initialClickLocation.Y)).AppendLine()
builder.Append("New Label Pos: " & "X: " & txt_clsText_ctrl_tmp.Location.X + (e.X - initialClickLocation.X))
builder.Append(",Y: " & txt_clsText_ctrl_tmp.Location.Y + (e.Y - initialClickLocation.Y)).AppendLine()
builder.Append("Mouse Button: " & e.Button.ToString()).AppendLine()
builder.Append("Left Edge: " & MouseIsInLeftEdge).AppendLine()
builder.Append("Right Edge: " & MouseIsInRightEdge).AppendLine()
builder.Append("Top Edge: " & MouseIsInTopEdge).AppendLine()
builder.Append("Bottom Edge: " & MouseIsInBottomEdge).AppendLine()
builder.Append("Cursor: " & appendMouseCursor)
ClsTextObj2.Value = builder.ToString()
End If
End Sub
Что мне здесь не хватает? Я могу успешно обновить другие части своего приложения, пока используется ЛЕВАЯ кнопка мыши, за исключением курсора мыши. Я даже пытался использовать Refresh() для элемента управления и некоторые другие глупые идеи, которые, казалось, никогда не заставляли курсор превращаться в руку во время движения элемента управления.
Вы даже можете видеть, что я успешно обновляю курсор мыши на основе краев элемента управления из MouseMove Sub. Однако при нажатии левой кнопки мыши обновление курсора мыши приостанавливается до тех пор, пока я не отпущу кнопку.
Обновление 10.19.18: вместо этого я использовал курсор формы:
If IsMouseLeftButton And IsMouseDown Then
Me.Cursor = Cursors.Hand
'txt_clsText_ctrl.Appearance.Cursor = Cursors.Hand
txt_clsText_ctrl.Location = New Point(txt_clsText_ctrl.Location.X + (e.X - initialClickLocation.X), txt_clsText_ctrl.Location.Y + (e.Y - initialClickLocation.Y))
End If
Поскольку я использовал курсор формы, я должен был обязательно обновить его до значения по умолчанию. Я обнаружил, что MouseUp отлично подходит для этого. По крайней мере, я пока не встречал никаких ошибок.
Private Sub ClsTextObj_MouseUp(sender As Object, e As MouseEventArgs)
If TypeOf sender Is STORE.PDFBuilder.clsTextObj Then
Dim txt_clsText_ctrl_tmp = DirectCast(sender, STORE.PDFBuilder.clsTextObj)
IsMouseDown = False
Me.Cursor = Cursors.Default
End If
End Sub
Наконец, для любого нормального элемента управления .NET вы можете использовать тот же код, но вместо того, чтобы использовать
Control.Appearance.Cursor
---> вместо этого вы должны использоватьControl.Cursor
clsTextObj
? Производный класс TextBox? Что делает его свойствоAppearance
? Установить/определить тип/стиль курсора? Вы должны проверить этот код. - person Jimi   schedule 18.10.2018