misterdemeanor
Goto Top

Eventhandling bei deaktivierten Controls

Windows Forms
.Net 2
Visual Basic 2005

Grützi,

das Problem an sich : Deaktivierte Steuerelemente feuern keine Ereignisse.

Weiß jemand wie man mit einem "Workaround" trotzdem auf die Ereignisse reagieren kann?

Zur Zeit versuche ich da in Richtung des Parents und dem überschreiben dessen Ereignisse an eine Lösung zu kommen, da aber Frischling in VB8...

Im konkreten Fall bei mir geht es darum "eigene" ToolTips auch auf deaktivierten ToolStripItems anzeigen zu können. Sind Sie aktiviert gibt es da keine Probleme ---> MouseEnter-Event...

Eine harte Nuss *gg*

Grüße
Felix

Content-Key: 30535

Url: https://administrator.de/contentid/30535

Printed on: April 19, 2024 at 11:04 o'clock

Member: misterdemeanor
misterdemeanor Apr 19, 2006 at 13:39:03 (UTC)
Goto Top
So, ich habe es jetzt wie folgt gelöst:

1)Eine Klasse erstellt die von ToolStrip abgeleitet ist.
2)Im Konstruktor wird der zu erstellenden Instanz mittels SetStyle die Eigenschaft EnableNotifyMessage zugeteilt.
2)Die Methode OnNotifyMessage überschrieben.

Nun kann ich in der Sub OnNotifyMessage die Messages direkt von Windows auswerten. Beim WM_MOUSEOVER schaue ich ob /unter den Koordinaten/ (wird der Sub als Parameter übergeben) sich ein /ToolStripItem/ befindet (Mittels GetItemAt(x,y) ).

Somit kann ich auch auf deaktivierten /ToolStripItems/ einen ToolTip anzeigen. Das wiederum auch nur indirekt, da ToolTips /nur/ auf von Windows.Forms.Control - abgeleitete Klassen angezeigt werden (Show und SetToolTip erwarten entsprechendes Argument).

Also hole ich mir mittels den Eigenschaften aus der Bounds-Property des /ToolStripItems/ dessen /Location/ innerhalb seines Containers (dem /ToolStrip/) und rufe die entsprechende Show-Methode des ToolTips auf.

Problem gelöst.

Die Klasse cusToolStrip:
Public Class cusToolStrip
  Inherits Windows.Forms.ToolStrip

  Const WM_MOUSEOVER = 512
  Private m_totInstance As New ToolTip
  Private m_shownToolTip4ItemName As String
  Private m_ToolTipSettings As List(Of ToolTipSetting)
  Private SHOWCUSTOMTOOLTIPS As Boolean

  Public Sub New()
    MyBase.New()
    Me.SetStyle(ControlStyles.EnableNotifyMessage, True)
    Me.m_totInstance.Active = False
    Me.ToolTipSettings = New List(Of ToolTipSetting)
  End Sub

  Public Property ToolTipSettings() As List(Of ToolTipSetting)
    Get
      Return Me.m_ToolTipSettings
    End Get
    Set(ByVal value As List(Of ToolTipSetting))
      Me.m_ToolTipSettings = value
    End Set
  End Property

  Protected Overrides Sub OnNotifyMessage(ByVal m As System.Windows.Forms.Message)
    Dim tstItem As ToolStripItem
    Dim x As Integer
    Dim y As Integer
    Select Case m.Msg
      Case WM_MOUSEOVER
        x = GetHiWord(m.LParam.ToInt64)
        y = GetLoWord(m.LParam.ToInt64)
        tstItem = Me.GetItemAt(x, y)
        If IsNothing(tstItem) Then
          m_totInstance.Active = False
          m_shownToolTip4ItemName = String.Empty
          Exit Sub
        End If
        If tstItem.Name = m_shownToolTip4ItemName Then Exit Sub
        ShowToolTip4Item(tstItem)
    End Select
  End Sub

  Private Sub ShowToolTip4Item(ByRef tstItem As ToolStripItem)
    Dim mes As String = ToolTipSettings.Item(tstItem.Tag).Message
      m_totInstance.Active = True
      m_totInstance.ToolTipTitle = ToolTipSettings.Item(tstItem.Tag).Title
      m_totInstance.ToolTipIcon = ToolTipSettings.Item(tstItem.Tag).Icon
      m_totInstance.IsBalloon = ToolTipSettings.Item(tstItem.Tag).IsBaloon
      Dim x = tstItem.Bounds.Left + CInt(tstItem.Width / 1.5)
      Dim y = CInt(tstItem.Height / 2)
      m_totInstance.Show(mes, tstItem.GetCurrentParent, x, y, ToolTipSettings(tstItem.Tag).Duration)
      m_shownToolTip4ItemName = tstItem.Name
  End Sub

  Public Function GetLoWord(ByVal l As Long) As Integer
      Return ((l / &H10000) And &HFFFF&)
  End Function

  Public Function GetHiWord(ByVal l As Long) As Integer
      Return (l And &HFFFF&)
  End Function
End Class

Falls sich wer wunderte was denn ToolTipSedtting ist :

Public Class ToolTipSetting
  Inherits List(Of ToolTipSetting)

  Private m_Title As String
  Private m_Message As String
  Private m_Icon As Windows.Forms.ToolTipIcon
  Private m_Duration As Integer
  Private m_IsBaloon As Boolean

  Public Sub New(ByVal Title As String, ByVal Message As String, ByVal Icon As ToolTipIcon, ByVal Duration As Integer, ByVal IsBaloon As Boolean)
    m_Title = Title
    m_Message = Message
    m_Icon = Icon
    m_Duration = Duration
    m_IsBaloon = IsBaloon
  End Sub

  Public Property Title() As String
    Get
      Return CStr(m_Title)
    End Get
    Set(ByVal value As String)
      m_Title = value
    End Set
  End Property
  Public Property Message() As String
    Get
      Return m_Message
    End Get
    Set(ByVal value As String)
      m_Message = value
    End Set
  End Property
  Public Property Icon() As ToolTipIcon
    Get
      Return m_Icon
    End Get
    Set(ByVal value As ToolTipIcon)
      m_Icon = value
    End Set
  End Property
  Public Property Duration() As Integer
    Get
      Return m_Duration
    End Get
    Set(ByVal value As Integer)
      m_Duration = value
    End Set
  End Property
  Public Property IsBaloon() As Boolean
    Get
      Return m_IsBaloon
    End Get
    Set(ByVal value As Boolean)
      m_IsBaloon = value
    End Set
  End Property
End Class

Zugegeben, das anzeigen der ToolTips hätte OOP-konform in den /Item/-Klassen stattfinden müssen, allerdings für alle /ToolStripItems/-Typen Klassen abzuleiten...? Für meine Problemstellung reicht das hier soweit aus.