ComboBox mit Image funktioniert nicht
Re: ComboBox mit Image funktioniert nicht
@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.
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
Widerstand ist zwecklos - Sie werden emuliert
- 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
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:Daffy0815 hat geschrieben:Könntest Du bitte das mit dem "OwnerDraw" etwas näher spezifizieren.
(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
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*

[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Re: ComboBox mit Image funktioniert nicht
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...
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
Widerstand ist zwecklos - Sie werden emuliert
- 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
Gerade zum ComboBoxGadget und auch zu ComboBoxEx findest Du aktuell einige Diskussionen im englischen Forum die Dir vielleicht weiter helfen könnten.Daffy0815 hat geschrieben:Was man mal versuchen sollte, das Ganze mit der API-Funktion ComboBoxEx zu realisieren.
Die müsste das eigentlich können.
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Re: ComboBox mit Image funktioniert nicht
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?
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
Widerstand ist zwecklos - Sie werden emuliert
Re: ComboBox mit Image funktioniert nicht
Als Alternative gibt es noch ColorRequester().Daffy0815 hat geschrieben:Offenbar muss keiner der Nutzer von PureBasic die Farben seiner Applikation einstellen.
Re: ComboBox mit Image funktioniert nicht
@edel
Klar, ist ne echte Alternative
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...
Klar, ist ne echte Alternative

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
Widerstand ist zwecklos - Sie werden emuliert
Re: ComboBox mit Image funktioniert nicht
sorry, aber sowas kann man doch grade mit PB leicht selber programmieren.Daffy0815 hat geschrieben:Klar, ist ne echte Alternative
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
a²+b²=mc²
Re: ComboBox mit Image funktioniert nicht
@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?
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
Widerstand ist zwecklos - Sie werden emuliert
Re: ComboBox mit Image funktioniert nicht
öhm, verstehe ich jetzt nicht. Die Summe der Höhe aller Elemente innerhalb der ListeDaffy0815 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?
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²