В Compact Framework у формы нет свойства ActiveControl. Проблема с невозникающими MouseDown и прочими событиями до появления меню известна, и чтобы обработать эти события, рекомендуется вызывать меню вручную. На самом деле MouseDown позволяет отловить нажатие "правой" кнопки мыши (e.Button = MouseButtons.Right), но это естественно не получится, если прогу запустить на КПК. Поэтому остается обработать MouseDown и использовать функцию вроде
- Код: Выделить всё
Imports System.Runtime.InteropServices
<DllImport("coredll", EntryPoint:="GetCapture", SetLastError:=True)> Public Function GetCapture() As IntPtr
End Function
Public Structure SHRGINFO
Public cbSize As Integer
Public hwndClient As IntPtr
Public pntDown As Point
Public dwFlags As Integer
End Structure
<DllImport("aygshell")> Public Function SHRecognizeGesture(ByRef info As SHRGINFO) As Integer
End Function
Public Function TapHolded(ByVal c As Control, ByVal x As Integer, ByVal y As Integer) As Boolean
Dim info As New SHRGINFO
c.Capture = True
With info
.cbSize = Runtime.InteropServices.Marshal.SizeOf(info)
.pntDown = New Point(x, y)
.dwFlags = &H1
.hwndClient = GetCapture()
End With
c.Capture = False
Dim cmd As Integer = SHRecognizeGesture(info)
Return (cmd = 1000)
End Function
Если TapHolded = True, то можно рассматривать это как щелчок правой кнопки и показать меню, иначе - щелчок левой кнопки. Параметры: с - контрол, на котором произошло MouseDown, x, y - координаты (относительно контрола c), в которых надо показать соответствующую анимацию в виде точек. Теперь можно написать один обработчик MouseDown для всех контролов, в нем проверять TapHolded, а объект, для которого вызвано меню - sender в этом обработчике MouseDown.