ComboBox mit Image funktioniert nicht

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: ComboBox mit Image funktioniert nicht

Beitrag von Daffy0815 »

@PureLust

Also WinDoof ist da wohl (außnahmsweise) unschuldig.
Sonst würde die Änderung der Systemschriften in der Systemsteuerung eine Wirkung zeigen.
Es bleibt aber im Programm immer bei 8 Punkt.

Könntest Du bitte das mit dem "OwnerDraw" etwas näher spezifizieren.

Ich schreibe normalerweise Programme für Microcontroller (vorzugsweise 8051-Assembler) und kenne mich in der
"Windows-Sprache" nicht so aus.
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: ComboBox mit Image funktioniert nicht

Beitrag von PureLust »

Daffy0815 hat geschrieben:Könntest Du bitte das mit dem "OwnerDraw" etwas näher spezifizieren.
Anbei mal eine auf Deine Bedürfnisse angepasste Variante des ComboBox_OwnerDraw Beispiels von Fred (also nun mit großen Icons und großer Schrift) aus dem Jahr 2003:
(getestet mit 4.50 RC1 und neuer Gadget-Lib (s. Link oben))

Code: Alles auswählen

; English forum: http://www.purebasic.fr/english/viewtopic.php?t=8674&highlight=
; Author: Fred
; Date: 09. December 2003
; OS: Windows
; Demo: No


; ComboBox OwnerDraw in PureBasic 
; 

Enumeration 
  #Window_0 
EndEnumeration 

Enumeration 
  #Gadget_0 
EndEnumeration 

LoadFont(0,"Arial", 23)

Procedure Open_Window_0() 
  If OpenWindow(#Window_0, 0, 0, 400, 200, "ComboBox OwnerDraw", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_TitleBar ) 
    If CreateGadgetList(WindowID(#Window_0)) 
      ComboBoxGadget(#Gadget_0, 60, 40, 330, 40,  #CBS_OWNERDRAWFIXED) 
      
      SendMessage_(GadgetID(ComboBoxGadget), #CB_SETITEMHEIGHT, GadgetID(ComboBoxGadget), 40)  ;<= hier wird die Höhe der PullDown-Items festgelegt
		SetGadgetFont(0,FontID(0))  ; Und natürlich nicht vergessen den größeren Font einzustellen
		
	EndIf 
  EndIf 
EndProcedure 

Open_Window_0() 

#DI_NORMAL = $0003 

Procedure WindowCallback(WindowID, Message, wParam, lParam) 
  Result = #PB_ProcessPureBasicEvents 

  Select Message 

    Case #WM_DRAWITEM 
      *DrawItem.DRAWITEMSTRUCT = lParam 
      
      If *DrawItem\CtlType = #ODT_COMBOBOX 

        SetBkMode_(*DrawItem\hDC, #TRANSPARENT) ; Text is rendered transparent 
        
        If *DrawItem\ItemState & #ODS_FOCUS 
          Brush = CreateSolidBrush_($FFEEFF) 
          FillRect_(*DrawItem\hDC, *DrawItem\rcItem, Brush) 
          DeleteObject_(Brush) 
          
          SetTextColor_(*DrawItem\hDC, $FF) 
        Else 
          FillRect_(*DrawItem\hDC, *DrawItem\rcItem, GetStockObject_(#WHITE_BRUSH)) 
        EndIf 

        If *DrawItem\itemID <> -1 
        	Text$ = Space(512) 
        	
          Debug SendMessage_(*DrawItem\hwndItem, #CB_GETLBTEXTLEN, *DrawItem\itemID, 0) ; Hmmm, Länge des Item-Textes ist immer 4 ???
          
          SendMessage_(*DrawItem\hwndItem, #CB_GETLBTEXT, *DrawItem\itemID, @Text$) 
          
          ; nachfolgend müstest Du statt "LoadIcon_(0, #IDI_ASTERISK)" dann Deine ImageID für diese Zeile übergeben.
          DrawIconEx_(*DrawItem\hDC, *DrawItem\rcItem\left+2   , *DrawItem\rcItem\top+1, LoadIcon_(0, #IDI_ASTERISK), 32, 32, 0, 0, #DI_NORMAL)
          
          TextOut_   (*DrawItem\hDC, *DrawItem\rcItem\left+2+40, *DrawItem\rcItem\top+1, Text$, Len(Text$)) ; die "+40" ist der Offest des Textes, um Platz für das Icon zu machen.
        EndIf 
      EndIf 
  
  EndSelect 
  
  ProcedureReturn Result 
EndProcedure 


SetWindowCallback(@WindowCallback()) 

  AddGadgetItem(#Gadget_0, -1, "Hmmmm ...") 
  AddGadgetItem(#Gadget_0, -1, "Der Text der") 
  AddGadgetItem(#Gadget_0, -1, "Items wird") 
  AddGadgetItem(#Gadget_0, -1, "nicht korrekt") 
  AddGadgetItem(#Gadget_0, -1, "angezeigt.") 
  
Repeat 
Until WaitWindowEvent() = #PB_Event_CloseWindow 

End 

; IDE Options = PureBasic v4.00 (Windows - x86)
; Folding = -
; EnableXP
Nur werden die Texte aus den Items nicht richtig angezeigt.
Ob sich da nun inzwischen seit 2003 etwas geändert hat, ein Fehler in Freds Beispiel ist oder das halt einer der bekannten 4.50er Bugs ist kann ich nicht sagen.

Wenn's mit PB 4.4 korrekt funktioniert, wird's an PB 4.5 liegen.
Ansonsten kann Dir da vielleicht einer unserer API-Päpste hier weiter helfen. . . . *zu edel rüberschiel* :mrgreen:
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: ComboBox mit Image funktioniert nicht

Beitrag von Daffy0815 »

Danke für das Beispiel wenngleich es wegen der Texte leider nicht verwendbar ist.

Was man mal versuchen sollte, das Ganze mit der API-Funktion ComboBoxEx zu realisieren.
Die müsste das eigentlich können.

So, und jetzt sag ich mal Buenas noches para todos...
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

Re: ComboBox mit Image funktioniert nicht

Beitrag von PureLust »

Daffy0815 hat geschrieben:Was man mal versuchen sollte, das Ganze mit der API-Funktion ComboBoxEx zu realisieren.
Die müsste das eigentlich können.
Gerade zum ComboBoxGadget und auch zu ComboBoxEx findest Du aktuell einige Diskussionen im englischen Forum die Dir vielleicht weiter helfen könnten.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: ComboBox mit Image funktioniert nicht

Beitrag von Daffy0815 »

Also etwas vernünftiges habe ich bis jetzt noch in keinem Forum gefunden!
Die Sprachauswahl habe ich mittlerweile durch Buttons mit den Flaggen der Länder gelöst.
Das ist bei 7 Sprachen auch kein Problem.

Aber, mal ne ganz blöde Frage:

Offenbar muss keiner der Nutzer von PureBasic die Farben seiner Applikation einstellen.

Gibt`s denn nirgendwo eine FUNKTIONIERENDE COMBOBOX in der man 140 (EINHUNDERTVIERZIG) vorgegebene Farben auswählen kann.
Und zwar OHNE das der Auswahlblock nur 8 Pixel hoch ist?
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Re: ComboBox mit Image funktioniert nicht

Beitrag von edel »

Daffy0815 hat geschrieben:Offenbar muss keiner der Nutzer von PureBasic die Farben seiner Applikation einstellen.
Als Alternative gibt es noch ColorRequester().
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: ComboBox mit Image funktioniert nicht

Beitrag von Daffy0815 »

@edel

Klar, ist ne echte Alternative :mrgreen:
An das Display (6,5 ") klebt man gleich einen Kugelschreiber damit man die Farbe auch trifft und den Briten, Franzosen, Spaniern, Portugiesen, Slowaken und Polen bringe ich dann noch Deutsch bei damit sie die Texte des ColorRequester auch lesen können...
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ComboBox mit Image funktioniert nicht

Beitrag von Kiffi »

Daffy0815 hat geschrieben:Klar, ist ne echte Alternative :mrgreen:
sorry, aber sowas kann man doch grade mit PB leicht selber programmieren.

Hier mal ein schnell hingeschmierter Code zur Demonstration:

Code: Alles auswählen

Enumeration 
  #Window
  #Container
  #Scrollbar
EndEnumeration

Procedure myCallback(hWnd, uMsg, wParam, lParam) 
  
  If uMsg = #WM_VSCROLL And lParam = GadgetID(#ScrollBar)
    
    ResizeGadget(#Container, #PB_Ignore, -GetGadgetState(#Scrollbar), #PB_Ignore, #PB_Ignore)
    
  EndIf
  
  ProcedureReturn #PB_ProcessPureBasicEvents 
  
EndProcedure 

OpenWindow(#Window, #PB_Ignore, #PB_Ignore, 320, 300, "")
ContainerGadget(#Container, 0, 0, 265, 5000)

If LoadFont(1, "Arial", 30)
  SetGadgetFont(#PB_Default, FontID(1))
EndIf

NewList myItem()

For Counter = 0 To 100
  
  AddElement(myItem())
  
  myItem()=TextGadget(#PB_Any, 0, newY, 265, 50, "Huhu" + Str(Counter), #PB_Text_Border | #SS_NOTIFY | #SS_CENTERIMAGE)
  
  SetGadgetColor(myItem(), #PB_Gadget_BackColor, RGB(Random(255),Random(255),Random(255)))
  
  newY + 50
  
Next

CloseGadgetList()

ScrollBarGadget(#Scrollbar, 265, 0, 55, 300, 0, 1000, 100, #PB_ScrollBar_Vertical)

SetWindowCallback(@myCallback(), #Window)

Repeat
  
  WWE = WaitWindowEvent()
  
  Select WWE
      
    Case #PB_Event_CloseWindow
      
      Quit = #True
      
    Case #PB_Event_Gadget
      
      ForEach myItem()
        If EventGadget() = myItem()
          Debug myItem()
          Break
        EndIf
      Next
      
  EndSelect
  
Until Quit = #True
Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: ComboBox mit Image funktioniert nicht

Beitrag von Daffy0815 »

@Kiffi

Danke, sieht schon ganz brauchbar aus!

Eine Sache daran verstehe ich allerdings nicht.

Damit auf die Liste "myItem()" zugegriffen werden kann muss diese ja "GLOBAL" zur Verfügung stehen.
In deinem Beispiel stellt das kein Problem dar, bei mir aber schon da die Farbeinstellung nur ein Teil einer Prozedur ist.

Frage: Was hat "myList()" für einen Datentyp und wie definiere ich den dann als "GLOBAL"?

Gruß

Holger


PS. Bin selber darauf gekommen "GLOBAL NEWLIST myList.l()"

Aber wie ich jetzt feststelle hat die Sache eine üblen Haken:

Die Länge der Liste ist durch die Höhe des Fensters begrenzt und das kann ich wieder nicht brauchen.
Lässt Sich die Länge der Liste irgendwie innerhalb des Fensters begrenzen?
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ComboBox mit Image funktioniert nicht

Beitrag von Kiffi »

Daffy0815 hat geschrieben:Die Länge der Liste ist durch die Höhe des Fensters begrenzt und das kann ich wieder nicht brauchen.
Lässt Sich die Länge der Liste irgendwie innerhalb des Fensters begrenzen?
öhm, verstehe ich jetzt nicht. Die Summe der Höhe aller Elemente innerhalb der Liste
liegt bei 32000 und ein paar Pixel (wird durch Windows beschränkt). Hast Du so viele
Farben / Flaggen / whatever?

Oder habe ich Dich da falsch verstanden?

Grüße ... Kiffi
a²+b²=mc²
Antworten