Seite 1 von 3
Comboboxgadget: Vertikale Ausrichtung des Inhalts
Verfasst: 23.08.2018 11:20
von techniker
Hallo,
gibt es unter Windows eine Möglichkeit den Inhalt eines ComboBoxGadget
vertikal auszurichten? (in meinem Fall zentriert)
Ich habe hier ein CBG mit 20Pixel Höhe. Schriftart ist Verdana 10.
Leider wird der Text dabei nicht vertikal zentriert angezeigt, sondern ist
nach unten versetzt und zum Teil abgeschnitten, wobei die 20 Pixel vom
CBG locker reichen würden.
Da andere Gadgets (String, Date, ..) ebenfalls mit 20 Pixelhöhe wunderbar
zurechtkommen und die GUI bereits komplett auf 20 Pixel optimiert ist
(sehr viele Gadgets aufgeteilt in einigen FrameGadgets), möchte ich nur
sehr ungern die komplette GUI nochmals zerpflügen..
Das meine ich:
Hat jemand einen Tipp für mich? Gerne auch Win-API..

Danke
Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts
Verfasst: 23.08.2018 18:55
von hjbremer
ich nehme an du meinst den Text im Editfeld der ComboBox
GetComboBoxInfo_() liefert dir das Handle vom Editfeld
und dann kannst du mit Apibefehlen fürs Editgadget den Text dort manipulieren
also mit #EM_GETCHARFORMAT und #EM_SETCHARFORMAT
Allerdings verstehe ich nicht das der Fehler überhaupt auftritt, ist mir noch nicht untergekommen.
Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts
Verfasst: 23.08.2018 19:02
von RSBasic
hjbremer hat geschrieben:ich nehme an du meinst den Text im Editfeld der ComboBox
Nein, meint er nicht. Er meint die ComboBox ohne #PB_ComboBox_Editable, wie man es in seinem Screenshot gut sehen kann.
Mit #PB_ComboBox_Editable hätte ich auch eine Lösung, aber ohne ist soweit ich weiß nur mit Ownerdraw-Callback möglich.
Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts
Verfasst: 23.08.2018 20:27
von ccode_new
Hallo techniker,
normalerweise wird der Text in einer Combobox vertikal in der Mitte (Center) und linksbündig (Horizontal left) angezeigt.
Also werden deine anderen ComboBoxGadget-Einträge korrekt angezeigt ?
Hast du schon einmal die "Moderne Themen Unterstützung" deaktiviert ? (Test)
Werden die Einträge beim Aufklappen der Boxen korrekt vertikal positioniert ?
Eine größere Sichtbarkeit (ohne Veränderung des Ausgangs-Gadgets) wäre:
SendMessage_(GadgetID(#Fragezeichen),#CB_SETITEMHEIGHT,0,30)
Ansonsten müsstest du dich mit diesem Flag anfreunden:
ComboBoxGadget(#Fragezeichen, 0, 0, 200, 20, #CBS_OWNERDRAWFIXED)
Du kannst nämlich auch direkt auf die Combobox-Einträge zeichnen.
Das kann dir sicherlich ein Windows-API-Spezialist hier im Forum erklären.
Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts
Verfasst: 24.08.2018 09:14
von techniker
Hallo ccode_new,
normalerweise wird der Text in einer Combobox vertikal in der Mitte (Center) und linksbündig (Horizontal left) angezeigt.
Nein. Der Text ist vertikal oben und horizontal linksbünding ausgerichtet.
Anscheinend hat das CBG einen festen, oberen Pixelwert über dem Text, bevor dieser gezeichnet wird..?!?
Schade, dass dies wohl nicht so einfach funktioniert.
Eine andere Frage:
Gibt es die Möglichkeit die Textfarbe des ausgewählten Elements (nicht die Auswahlliste) zu ändern?
Oder noch besser die Hintergrundfarbe des CBG (nicht die Auswahlliste)?
Dabei soll dem User eine nicht freigegebene, aber dennoch zulässige Auswahlkombination über mehrere CBG aufgezeigt werden.
Danke.
Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts
Verfasst: 24.08.2018 11:49
von mhs
techniker hat geschrieben:...
Ich habe hier ein CBG mit 20Pixel Höhe. Schriftart ist Verdana 10.
Leider wird der Text dabei nicht vertikal zentriert angezeigt, sondern ist
nach unten versetzt und zum Teil abgeschnitten, wobei die 20 Pixel vom
CBG locker reichen würden. ...
Mal abgesehen davon, dass 20px bei Verdana 10 auch für ein normales Textfeld eigentlich zu klein ist und mindestens 21px hoch sein sollte, wäre ein einfacher Workaround die Schriftgröße in Comboboxen auf 8 zu reduzieren.
Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts
Verfasst: 24.08.2018 11:55
von techniker
mhs hat geschrieben:
..wäre ein einfacher Workaround die Schriftgröße in Comboboxen auf 8 zu reduzieren.
Diesen Weg habe ich bereits beschritten: Gadgets auf 22px erhöht und Font auf 9pt reduziert.
Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts
Verfasst: 24.08.2018 14:07
von ccode_new
Nein. Der Text ist vertikal oben und horizontal linksbünding ausgerichtet
Du hast vollkommen recht.
Ich bin aber auch zu blöd.
Die Verwendung einer kleineren Schriftart wäre der einfachste Weg.
Aber es muss auch eine Möglichkeit über die Windows-API geben, um den Text vertikal in einer Combobox auszurichten. Ich kenne dieses Verhalten auch von einem anderen Windowsprogramm. Dort wird per Standard der Text in einer Combobox vertikal in der Mitte ausgerichtet.
Ich bin mir zwar noch nicht ganz sicher ob dort per Standard angepasste Boxen verwendet werden. Aber grundsätzlich müsste es trotzdem ohne externes Framework (wx, gtk, qt, .net) über die Windows 32 API gehen.
Ich werde mich mal heute Abend mit dem Thema befassen.
Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts
Verfasst: 24.08.2018 18:55
von ccode_new
Hallöchen!!!
Ich habe bisher auch keine bessere Lösung gefunden.
(Ohne es selber zu zeichnen.)
Das hier habe ich jetzt mal zusammengebastelt:
Code: Alles auswählen
Global Dim Eintrag.s(9)
#POS_NORMAL = 0
#POS_HCENTER = 1
#POS_VCENTER = 2
#POS_HVCENTER = 3
For i = 0 To ArraySize(Eintrag())
Eintrag(i) = "Eintrag "+Str(i)
Next i
Procedure ComboBoxExtra(cid, Array item.s(1), *DRAWITEM.DRAWITEMSTRUCT, align = 0, fgcolor = $0, bgcolor = $FFFFFF)
Protected w, h, hp, vp, TextSize.SIZE
w = GadgetWidth(cid)
h = GadgetHeight(cid)
;fgbrush = CreateSolidBrush_(fgcolor)
bgbrush = CreateSolidBrush_(bgcolor)
If *DRAWITEM\CtlType = #ODT_COMBOBOX
id = *DRAWITEM\itemID
If id >= 0 And *DRAWITEM\CtlID = cid
InflateRect_(*DRAWITEM\rcItem,-1,-1)
FillRect_(*DRAWITEM\hDC,*DRAWITEM\rcItem,bgbrush)
FrameRect_(*DRAWITEM\hDC,*DRAWITEM\rcItem,bgbrush)
SetBkColor_(*DRAWITEM\hDC, bgcolor)
SetTextColor_(*DRAWITEM\hDC, fgcolor)
If align = 0
*DRAWITEM\rcItem\left = 4
ElseIf align = 1
If GetTextExtentPoint32_(*DRAWITEM\hDC, item(id), Len(item(id)), @TextSize)
hp = (GadgetWidth(cid)/2) - (TextSize\cx / 2) - 4
*DRAWITEM\rcItem\left = hp
EndIf
ElseIf align = 2
If GetTextExtentPoint32_(*DRAWITEM\hDC, item(id), Len(item(id)), @TextSize)
vp = (GadgetHeight(cid)/2) - (TextSize\cy / 2) - 4
*DRAWITEM\rcItem\left = 4
*DRAWITEM\rcItem\top + vp
EndIf
ElseIf align = 3
If GetTextExtentPoint32_(*DRAWITEM\hDC, item(id), Len(item(id)), @TextSize)
hp = (GadgetWidth(cid)/2) - (TextSize\cx / 2) - 4
vp = (GadgetHeight(cid)/2) - (TextSize\cy / 2) - 4
*DRAWITEM\rcItem\left = hp
*DRAWITEM\rcItem\top + vp
EndIf
EndIf
DrawText_(*DRAWITEM\hDC, item(id), -1, *DRAWITEM\rcItem, #DT_NOCLIP)
EndIf
EndIf
EndProcedure
Procedure WndProc(hwnd, uMsg, wParam, lParam)
Result = #PB_ProcessPureBasicEvents
Select uMsg
Case #WM_DRAWITEM
fgcolor = RGB(0,255,0)
bgcolor = RGB(255,255,0)
*DRAWITEM.DRAWITEMSTRUCT = lParam
ComboBoxExtra(1, Eintrag(), *DRAWITEM.DRAWITEMSTRUCT, #POS_HVCENTER, fgcolor, bgcolor)
EndSelect
ProcedureReturn Result
EndProcedure
;-Main
OpenWindow(0,0,0,640,480, "Mein ComboBox-Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget )
SetWindowCallback(@WndProc())
ComboBoxGadget(1,10,10,180, 40,#CBS_OWNERDRAWFIXED)
;Der Eintragstext steht im Array Eintrag()
AddGadgetItem(1,-1, "")
AddGadgetItem(1,-1, "")
AddGadgetItem(1,-1, "")
SendMessage_(GadgetID(1),#CB_SETITEMHEIGHT,0,40)
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Bitte! Danke!
Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts
Verfasst: 24.08.2018 19:13
von techniker
Danke für deine Bemühungen!
Noch eine Frage:
Kann ich es irgendwie erreichen, dass die Dropdown-Liste unverändert bleibt?
(d.h. die Farbveränderungen hier nicht greifen)