none
Combobox touchfähig machen RRS feed

  • Allgemeine Diskussion

  • Ich scheitere gerade an einer Aufgabe, die ich mir sehr einfach vorgestellt habe: Eine Combobox so darzustellen, dass man sie mit dem Finger bedienen kann. Also eine neue Klasse erstellen mit DrawMode.OwnerDrawVariable und neuer ItemHeight, WndProc überschreiben um den Button wieder zu sehen. Das klappt dann auch.

    Aber das große Problem: Ich will den Button breiter zeichnen, weil man 17 Pixel Breite kaum trifft. In WndProc kann ich den Button zwar breiter zeichnen und in OnMouseDown die Liste aufklappen falls ich auf dem Bereich bin, aber ein Teil des Buttons wird weiß übermalt. Das liegt wohl an einer Textbox, die innerhalb der Combobox enthalten ist. Gibt es irgend eine Möglichkeit diese Textbox schmäler zu machen?

    (oder vllt sogar eine galantere Möglichkeit den Button breiter zu ziehen?)

    Vielen Dank im Voraus für eure Vorschläge!

    Donnerstag, 9. April 2015 13:11

Alle Antworten

  • Hallo,

    zeige bitte dienen Code. Sonst würden wir von ganz vorne Anfangen um eine Antwort für dich zu finden.

    Aufgrund deiner Beschreibung gehe ich davon aus, das du WinForms nutzt. Warum nutzt du nicht WPF oder eine Windows Store App? Beides lässt sich um ein vielfaches leichter anpassen und letzteres muss sogar auf Touch ausgelegt sein um richtig zu funktionieren.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Donnerstag, 9. April 2015 13:14
    Moderator
  • Also prinzipiell sind diese Technologien nicht unbedingt für Touchbediehnung geeignet, die Größe ist nähmich wohl kaum das einzige Kriterium wie man glauben könnte.

    Wenn du Wert auf Touch legst, dann scheint es so, als sei dir die Benutzeroberfläche (GUI/UI) nicht gerade unwichtig, deshalb würde ich dir WPF/XAML empfehlen...

    Zu deiner frage konkret wüsste ich jetzt keine Lösung, aber vielleicht antwortet noch jemand anderes mal.


    © 2015 Thomas Roskop

    Germany // Deutschland

    Donnerstag, 9. April 2015 13:17
  • ah, glatt vergessen zu erwähnen. Ja, ich verwende WinForms. Die Vorgabe ist vom Arbeitgeber so. Daran kann ich nichts ändern.

        Private Const c_Height As Integer = 32

        Private m_bolMouseDown As Boolean = False
        Private m_RectButton As Rectangle

        Dim oFormat As New StringFormat

        Public Sub New()

            RemoveHandler MyBase.DrawItem, AddressOf _drawItem
            RemoveHandler MyBase.MeasureItem, AddressOf _measureItem
            MyBase.DrawMode = DrawMode.OwnerDrawVariable
            MyBase.ItemHeight = c_Height
            'MyBase.IntegralHeight = False
            'Me.SetStyle(ControlStyles.UserPaint, True)
            'MyBase.SetStyle(ControlStyles.AllPaintingInWmPaint, True)
            'MyBase.SetStyle(ControlStyles.OptimizedDoubleBuffer, True)
            AddHandler MyBase.DrawItem, AddressOf _drawItem
            AddHandler MyBase.MeasureItem, AddressOf _measureItem

            oFormat.LineAlignment = StringAlignment.Center
        End Sub

    Protected Overrides Sub OnMouseUp(ByVal e As MouseEventArgs) MyBase.OnMouseUp(e) m_bolMouseDown = False Invalidate() End Sub Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs) MyBase.OnMouseDown(e) m_RectButton = New Rectangle(Width - 30, 0, 29, Height) If e.X >= m_RectButton.Left Then m_bolMouseDown = True Invalidate() Me.DroppedDown = True End If End Sub Protected Overrides Sub OnResize(ByVal e As EventArgs) MyBase.OnResize(e) Invalidate() End Sub Protected Overrides Sub WndProc(ByRef m As Message) Try Dim g As Graphics = Graphics.FromHwnd(Handle) MyBase.WndProc(m) Select Case m.Msg Case &H85 g.Clear(BackColor) Case &HF 'MyBase.WndProc(m) g.DrawRectangle(New Pen(BackColor, 2), New Rectangle(2, 2, Width - 4, Height - 4)) 'g.DrawString(Me.Text, Me.Font, New SolidBrush(Color.Black), New PointF(Me.Bounds.X, Me.Bounds.Y), oFormat) 'Dim rect As New Rectangle(2, 2, Width - 35, Height - 4) 'g.FillRectangle(Brushes.Silver, rect) 'g.DrawString(Me.Text, Me.Font, New SolidBrush(Color.Black), rect, oFormat) m_RectButton = New Rectangle(Width - 30, 0, 29, Height) If m_bolMouseDown Then ControlPaint.DrawComboButton(g, m_RectButton, ButtonState.Pushed) Else ControlPaint.DrawComboButton(g, m_RectButton, ButtonState.Flat) End If End Select g.Dispose() Catch ex As Exception Dim strMsg As String = String.Format("{0} - {1}.{2} Combobox {3}", ex.Message, "ctlTabletCombobox", Reflection.MethodInfo.GetCurrentMethod.Name, Me.Name) MessageBox.Show(strMsg) End Try End Sub


    Das ist die Erweiterung in der abgeleiteten Klasse, die den Button neu zeichnet. Mit MeasureItem und DrawItem lässt sich ja leider nur der Dropdown beeinflussen.

    Ich befürchte dass ich OnPaint überschreiben muss. Aber damit habe ich bisher überhaupt keinen Erfolg. Die interne Textbox liegt immernoch darüber.

    Freitag, 10. April 2015 07:16
  • Hallo Quidnunc1987,

    Bist Du weitergekommen? Ist der Thread noch aktuell?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 23. April 2015 09:56
    Administrator