Comboboxgadget: Vertikale Ausrichtung des Inhalts

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Comboboxgadget: Vertikale Ausrichtung des Inhalts

Beitrag 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:
Bild

Hat jemand einen Tipp für mich? Gerne auch Win-API.. :)
Danke
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts

Beitrag 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.
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts

Beitrag 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.
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts

Beitrag 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.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts

Beitrag 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.
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts

Beitrag 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.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts

Beitrag 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!
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Comboboxgadget: Vertikale Ausrichtung des Inhalts

Beitrag von techniker »

Danke für deine Bemühungen! 8)

Noch eine Frage:
Kann ich es irgendwie erreichen, dass die Dropdown-Liste unverändert bleibt?
(d.h. die Farbveränderungen hier nicht greifen)
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Antworten