Fragensteller
Combobox touchfähig machen

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!
- Typ geändert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 8. Mai 2015 07:51 Keine Rückmeldung des Fragestellers
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 -
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
-
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 SubProtected 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.
-
Hallo Quidnunc1987,
Bist Du weitergekommen? Ist der Thread noch aktuell?
Gruß,
DimitarBitte 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.