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 »

@Dark

Nun, Interesse habe ich (und Andere hier im Forum) schon.
Vielleicht funktioniert die Lösung ja besser für den Zweck!
Also, immer her damit.

Gruß Holger
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
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 (und Anderen)

Ich habe (gemäß Tipp von Kiffi) das Programm zum Selektieren von Sprache und Farben hier

http://hosting.alexander-n.de/=MTA1LjEyNzYxOTY1MzM=

abgelegt.

Das Ganze sieht dann so aus:

http://hosting.alexander-n.de/=MTA2LjEyNzYyMDAwMTI=

http://hosting.alexander-n.de/=MTA3LjEyNzYyMDAwNzY=
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Dark
Beiträge: 93
Registriert: 24.08.2007 20:36
Kontaktdaten:

Re: ComboBox mit Image funktioniert nicht

Beitrag von Dark »

Hier der Code:

Comboboxex.pbi

Code: Alles auswählen

CompilerIf Defined(PB_GadgetVT, #PB_Structure) = #False
Structure PB_GadgetVT
  GadgetType.l
  SizeOf.l
  GadgetCallback.l
  FreeGadget.l
  GetGadgetState.l
  SetGadgetState.l
  GetGadgetText.l
  SetGadgetText.l
  AddGadgetItem2.l
  AddGadgetItem3.l
  RemoveGadgetItem.l
  ClearGadgetItemList.l
  ResizeGadget.l
  CountGadgetItems.l
  GetGadgetItemState.l
  SetGadgetItemState.l
  GetGadgetItemText.l
  SetGadgetItemText.l
  OpenGadgetList2.l
  GadgetX.l
  GadgetY.l
  GadgetWidth.l
  GadgetHeight.l
  HideGadget.l
  AddGadgetColumn.l
  RemoveGadgetColumn.l
  GetGadgetAttribute.l
  SetGadgetAttribute.l
  GetGadgetItemAttribute2.l
  SetGadgetItemAttribute2.l
  SetGadgetColor.l
  GetGadgetColor.l
  SetGadgetItemColor2.l
  GetGadgetItemColor2.l
  SetGadgetItemData.l
  GetGadgetItemData.l
EndStructure
CompilerEndIf

CompilerIf Defined(PB_Gadget, #PB_Structure) = #False
Structure PB_Gadget
  Gadget.l
  *VT.PB_GadgetVT
  UserData.l
  OldCallback.l
  Daten.l[4]
EndStructure
CompilerEndIf

Global *ComboBoxExVT.PB_GadgetVT = 0

Procedure InitComboBoxEx()
  Protected  InitCom.INITCOMMONCONTROLSEX
  InitCom\dwSize = SizeOf(INITCOMMONCONTROLSEX)
  InitCom\dwICC = #ICC_USEREX_CLASSES
  If InitCommonControlsEx_(InitCom)
    ProcedureReturn #True  
  EndIf
  ProcedureReturn #False
EndProcedure

Procedure GetGadgetParent()
  !EXTRN _PB_Object_GetThreadMemory@4
  !EXTRN _PB_Gadget_Globals
  !MOV   Eax,[_PB_Gadget_Globals]
  !push  eax
  !call  _PB_Object_GetThreadMemory@4
  !MOV   Eax,[Eax]
  ProcedureReturn
EndProcedure

Procedure GetGadgetObject(ID.i)
  !EXTRN _PB_Object_GetObject@8
  !EXTRN _PB_Gadget_Objects
  !PUSH  dword[p.v_ID]
  !PUSH  dword [_PB_Gadget_Objects]   
  !CALL  _PB_Object_GetObject@8
  ProcedureReturn
EndProcedure

Procedure AddGadgetItem3CBex(*Gadget.PB_Gadget,Position.l,Text.s, Image, Flags.l)
  Protected Index
  Index = ImageList_Add_(*Gadget\Daten[0],Image,0)

  If Index <> -1
    
    Protected Entry.COMBOBOXEXITEM 
    
    #CBEIF_TEXT           = 1
    #CBEIF_IMAGE          = 2
    #CBEIF_SELECTEDIMAGE  = 4
   
    With Entry
      \mask = #CBEIF_IMAGE | #CBEIF_TEXT | #CBEIF_SELECTEDIMAGE
      \iItem = Position
      \pszText = @Text
      \cchTextMax = Len(Text)
      \iSelectedImage = Index
      \iImage = Index
    EndWith
    
    ProcedureReturn SendMessage_(*Gadget\Gadget,#CBEM_INSERTITEM,0,Entry)
  
  EndIf
  
  ProcedureReturn #False

EndProcedure

Procedure AddGadgetItem2CBex(*Gadget.PB_Gadget,Position.l,Text.s, Image)
  AddGadgetItem3CBex(*Gadget.PB_Gadget,Position.l,Text.s, Image,0)
EndProcedure

Procedure RemoveGadgetItemEx(*Gadget.PB_Gadget,Position.l)
  Protected Entry.COMBOBOXEXITEM 
  Protected Image.i
  Protected Count.i
  Protected i.i
  
  Entry\iItem = Position
  Entry\mask = #CBEIF_IMAGE
  
  If SendMessage_(*Gadget\Gadget,#CBEM_GETITEM,0,Entry)   
    
    Image = Entry\iImage
    #CBEM_DELETEITEM = #CB_DELETESTRING
    Count = SendMessage_(*Gadget\Gadget,#CBEM_DELETEITEM,Position,0) 
    
    If Count <> #CB_ERR
      
      If ImageList_Remove_(*Gadget\Daten[0],Image)
        
        For i = Position To Count -1
          Entry\iItem = i
          Entry\mask = #CBEIF_IMAGE | #CBEIF_SELECTEDIMAGE
          
          If SendMessage_(*Gadget\Gadget,#CBEM_GETITEM,0,Entry)  
            
            Entry\iImage - 1
            Entry\iSelectedImage - 1
            SendMessage_(*Gadget\Gadget,#CBEM_SETITEM,0,Entry)
          
          EndIf
        
        Next
      
        ProcedureReturn #True
      
      EndIf
    
    EndIf
  
  EndIf
  ProcedureReturn #False 
EndProcedure

Procedure OwnWndProc(hWnd.i, message.i, wParam.i, lParam.i)
 ProcedureReturn DefWindowProc_(hWnd.i, message.i, wParam.i, lParam.i)  
EndProcedure

Procedure ComboBoxExGadget(Gadget.i, x.i, y.i, Breite.i, Hoehe.i,Flags.i=0,ImageWidth.i=16,ImageHeight.i=16) 
  Protected GadgetHandle.l
  Protected *GadgetInfo.PB_Gadget
  Protected oldHwnd.i
  Protected Hwnd.i
  
  If Gadget = #PB_Any
    GadgetHandle = ComboBoxGadget(Gadget.i, x.i, y.i, Breite.i, Hoehe.i, Flags.i)
    If GadgetHandle = 0
      ProcedureReturn #False
    EndIf
  Else
    If ComboBoxGadget(Gadget.i, x.i, y.i, Breite.i, Hoehe.i, Flags.i) = #False
      ProcedureReturn #False
    Else
      GadgetHandle = Gadget
    EndIf       
  EndIf     
 
  oldHwnd = GadgetID(GadgetHandle)      
  *GadgetInfo = GetGadgetObject(GadgetHandle) ;GetProp_(oldHwnd,"GadgetInfo")
  If *GadgetInfo
    
    Hwnd = CreateWindowEx_(0,"ComboBoxEx32",0 ,#WS_CHILD| #WS_VISIBLE |#CBS_DROPDOWN | #CBS_AUTOHSCROLL | #WS_VSCROLL | #CBS_DROPDOWNLIST | Flags,x,y,Breite,Hoehe,GetGadgetParent(),GetDlgCtrlID_(oldHwnd),GetModuleHandle_(0),0)
    
    If Hwnd
    
      If *ComboBoxExVT = 0
        
        *ComboBoxExVT = AllocateMemory(*GadgetInfo\VT\SizeOf)
       
        If *ComboBoxExVT
          CopyMemory(*GadgetInfo\VT, *ComboBoxExVT, *GadgetInfo\VT\SizeOf)
            
          ; Modify V-Table
          *ComboBoxExVT\AddGadgetItem2 = @AddGadgetItem2CBex()
          *ComboBoxExVT\AddGadgetItem3 = @AddGadgetItem3CBex()  
          *ComboBoxExVT\RemoveGadgetItem = @RemoveGadgetItemEx()
        EndIf
     
      EndIf
        
      If *ComboBoxExVT
        *GadgetInfo\VT = *ComboBoxExVT      
        *GadgetInfo\Gadget = Hwnd
        *GadgetInfo\VT\AddGadgetItem2 = @AddGadgetItem2CBex()
        *GadgetInfo\Daten[0] = ImageList_Create_(ImageWidth,ImageHeight, #ILC_COLOR24,0,1)
        
        If *GadgetInfo\Daten[0]
          
          #CBEM_SETIMAGELIST = (#WM_USER + 2)
          SendMessage_(Hwnd,#CBEM_SETIMAGELIST,0,*GadgetInfo\Daten[0])
          
          SetWindowLongPtr_(oldHwnd,#GWLP_WNDPROC,@OwnWndProc()) 
          DestroyWindow_(oldHwnd)
          
          If Gadget = #PB_Any
            ProcedureReturn GadgetHandle
          Else
            ProcedureReturn #True
          EndIf
        EndIf
      
      EndIf
    EndIf
    DestroyWindow_(oldHwnd)
  EndIf

  ProcedureReturn #False
EndProcedure
Testcode:

Code: Alles auswählen

XIncludeFile "comboboxex.pbi"

If OpenWindow(0,0,0,300,300,"Test")
  ComboBoxExGadget(1,0,0,200,200,0,64,64)
  
  CreateImage(1,64,64,32)
  StartDrawing(ImageOutput(1))
    Box(0,0,64,64,RGB(255,0,0))
    Box(10,10,44,44,RGB(0,0,255))
  StopDrawing()
  
  AddGadgetItem(1,-1,"Test",ImageID(1))
  AddGadgetItem(1,-1,"Test 2",ImageID(1))
  AddGadgetItem(1,-1,"Test 3",ImageID(1))
  SetGadgetState(1,1)
  
  
  Repeat
    Event = WaitWindowEvent()   
    If Event = #PB_Event_Gadget 
      If EventGadget() = 1
        Debug "Changed!"
      EndIf
    EndIf
  Until Event = #PB_Event_CloseWindow
  
EndIf
Mfg,
DarkPlayer
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: ComboBox mit Image funktioniert nicht

Beitrag von Daffy0815 »

@Darkplayer

Also, das entspricht eigentlich genau dem was ich ursprünglich gesucht hatte.

Wenn ich das richtig verstanden habe, besteht aber unter Umständen die Gefahr, das andere Gadgets von PB
nach Einbindung der Funktionen nicht mehr richtig funktionieren.

Wie hoch schätzt Du denn die Gefahr ein?

Gruß

Holger
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Dark
Beiträge: 93
Registriert: 24.08.2007 20:36
Kontaktdaten:

Re: ComboBox mit Image funktioniert nicht

Beitrag von Dark »

Daffy0815 hat geschrieben:@Darkplayer

Also, das entspricht eigentlich genau dem was ich ursprünglich gesucht hatte.

Wenn ich das richtig verstanden habe, besteht aber unter Umständen die Gefahr, das andere Gadgets von PB
nach Einbindung der Funktionen nicht mehr richtig funktionieren.

Wie hoch schätzt Du denn die Gefahr ein?

Gruß

Holger
Hallo,

andere Gadgets sind davon nicht betroffen, es könnte nur sein, das manche Gadget Befehle (z.b. sowas wie SetGadgetData) für dieses veränderte Gadget nicht funktionieren. Andere Gadgets sollten aber noch genau so funktionieren wie vorher.

mfg,
DarkPlayer
Benutzeravatar
Daffy0815
Beiträge: 390
Registriert: 15.06.2005 00:44
Wohnort: 65719 Hofheim
Kontaktdaten:

Re: ComboBox mit Image funktioniert nicht

Beitrag von Daffy0815 »

So, erst mal vielen tausend Dank an "Dark" für die Programmteile zum Aufbau der Auswahl mit ComboBoxEx!!!!

Ich habe das bereits veröffentlichte Programm mit der Sprach- / Farbauswahl mit den Scrollboxen nochmal überarbeitet und nun in der Form
die ich ursprünglich machen wollte, nämlich mit ComboBoxen, gemacht.

Das Ganze sieht nun so aus:

http://hosting.alexander-n.de/=MTExLjEyNzYyOTc4NDA=

oder so:

http://hosting.alexander-n.de/=MTEyLjEyNzYyOTc4OTU=

Den Quellcode findet ihr hier:

http://hosting.alexander-n.de/=MTEzLjEyNzYyOTc5OTg=


Ein kleiner "Wermutstropfen" steckt noch drin in der Sache.
Der Aufbau der ComboBoxen ist sehr langsam.
Da man aber nicht dauernd die Farben des Systems ändern wird, ist das in diesem Fall unproblematisch.


Übrigens, sollte hier mal jemand einen Tipp zu Microcontrollern, insbesondere der 51er-Derrivate benötigen, dann kann er sich gerne melden.
Wir sind LINUX
Widerstand ist zwecklos - Sie werden emuliert
Antworten