SetGadgetItemData & SetGadgetItemColor fuer Panel

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Re: SetGadgetItemData & SetGadgetItemColor fuer Panel

Beitrag von Lord »

Hallo Edel!

Wie muß die PanelGadget.pbi angepaßt werden,
damit sie auch auf Win7, x64 läuft?
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: SetGadgetItemData & SetGadgetItemColor fuer Panel

Beitrag von ts-soft »

Structuren austauschen, gegen diese:

Code: Alles auswählen

;{ pb intern struct 
CompilerIf Defined(PB_GadgetVT, #PB_Structure) = #False 
  Structure PB_GadgetVT    
  GadgetType.l
  SizeOf.l  
  GadgetCallback.i 
  FreeGadget.i
  GetGadgetState.i 
  SetGadgetState.i 
  GetGadgetText.i
  SetGadgetText.i 
  AddGadgetItem2.i 
  AddGadgetItem3.i 
  RemoveGadgetItem.i 
  ClearGadgetItemList.i 
  ResizeGadget.i
  CountGadgetItems.i 
  GetGadgetItemState.i 
  SetGadgetItemState.i 
  GetGadgetItemText.i
  SetGadgetItemText.i 
  OpenGadgetList2.i
  GadgetX.i
  GadgetY.i 
  GadgetWidth.i 
  GadgetHeight.i 
  HideGadget.i
  AddGadgetColumn.i 
  RemoveGadgetColumn.i 
  GetGadgetAttribute.i 
  SetGadgetAttribute.i 
  GetGadgetItemAttribute2.i 
  SetGadgetItemAttribute2.i 
  SetGadgetColor.i
  GetGadgetColor.i 
  SetGadgetItemColor2.i 
  GetGadgetItemColor2.i 
  SetGadgetItemData.i
  GetGadgetItemData.i 
EndStructure 
CompilerEndIf 
 
CompilerIf Defined(PB_Gadget, #PB_Structure) = #False 
Structure PB_Gadget 
  Gadget.i
  *VT.PB_GadgetVT 
  UserData.i
  OldCallback.i
  Daten.i[4] 
EndStructure 
 
Structure PB_Panel_User_Data 
   user_data.i
   static_callback.i
EndStructure 
 
CompilerEndIf ;} 
Alle SetWindowLong_ und GetWindowLong_ gegen SetWindowLongPtr_ und GetWindowLongPrt_ austauschen
und dann sollte es gehen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Re: SetGadgetItemData & SetGadgetItemColor fuer Panel

Beitrag von Lord »

Hallo ts-soft!

Danke für die schnelle Antwort.

Es wird aber leider beim Compilieren bemängelt,
daß in dieser Struktur

Code: Alles auswählen

Structure PB_Panel_User_Data
   user_data.i
   static_callback.i
EndStructure 
forecolor und backcolor fehlen.

Füge ich diese wie in der ursprünglichen *.pbi hinzu,
läßt sich das Programm mit der Include compilieren,
der Tab-Text läßt sich aber nicht einfärben, sondern
bleibt schwarz.
Ich habe sowohl forecolor.l und backcolor.l als auch
forecolor.i und backcolor.i ausprobiert.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: SetGadgetItemData & SetGadgetItemColor fuer Panel

Beitrag von ts-soft »

In meiner Version hab ich den Color-Kram rausgeschmissen, den brauche ich nicht :mrgreen:
Die Funktioniert aber in x64 und x86. Vielleicht meldet sich edel ja noch.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Re: SetGadgetItemData & SetGadgetItemColor fuer Panel

Beitrag von Lord »

Danke ts-soft.
Ich kann ja jetzt wenigstens mein Programm
wieder kompilieren. Kommt Zeit, kommt Farbe.

Ich warte dann mal auf edle Hilfe. :wink:
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: SetGadgetItemData & SetGadgetItemColor fuer Panel

Beitrag von ts-soft »

Code: Alles auswählen

;{ pb intern struct 
EnableExplicit
CompilerIf Defined(PB_GadgetVT, #PB_Structure) = #False 
Structure PB_GadgetVT 
  GadgetType.l    
  SizeOf.l        
  GadgetCallback.i 
  FreeGadget.i 
  GetGadgetState.i 
  SetGadgetState.i 
  GetGadgetText.i 
  SetGadgetText.i 
  AddGadgetItem2.i 
  AddGadgetItem3.i 
  RemoveGadgetItem.i 
  ClearGadgetItemList.i 
  ResizeGadget.i 
  CountGadgetItems.i 
  GetGadgetItemState.i 
  SetGadgetItemState.i 
  GetGadgetItemText.i 
  SetGadgetItemText.i 
  OpenGadgetList2.i 
  GadgetX.i 
  GadgetY.i 
  GadgetWidth.i 
  GadgetHeight.i 
  HideGadget.i 
  AddGadgetColumn.i 
  RemoveGadgetColumn.i 
  GetGadgetAttribute.i 
  SetGadgetAttribute.i 
  GetGadgetItemAttribute2.i 
  SetGadgetItemAttribute2.i 
  SetGadgetColor.i 
  GetGadgetColor.i 
  SetGadgetItemColor2.i 
  GetGadgetItemColor2.i 
  SetGadgetItemData.i 
  GetGadgetItemData.i 
EndStructure 
CompilerEndIf 
 
CompilerIf Defined(PB_Gadget, #PB_Structure) = #False 
Structure PB_Gadget 
  Gadget.i 
  *VT.PB_GadgetVT 
  UserData.i 
  OldCallback.i 
  Daten.i[4] 
EndStructure 
 
Structure PB_Panel_User_Data 
   user_data.i 
   forecolor.l 
   backcolor.l 
   static_callback.i 
EndStructure 
 
CompilerEndIf ;} 
 
Declare PB_GetPanelStaticItem(*gadget.PB_Gadget   ,item) 
Declare PB_GetGadgetItemData (*gadget.PB_Gadget   ,item) 
Declare PB_SetGadgetItemData (*gadget.PB_Gadget   ,item,value) 
 
Procedure PB_PanelStaticCB(hwnd,msg,wparam,lparam) 
   Protected *pud.PB_Panel_User_Data    
   Protected callback.i 
    
   *pud        = GetWindowLongPtr_(hwnd,#GWL_USERDATA) 
   callback = *pud\static_callback 
    
   If #WM_DESTROY = msg 
      FreeMemory(*pud)      
   EndIf 
    
   ProcedureReturn CallWindowProc_(callback,hwnd,msg,wparam,lparam) 
EndProcedure 
 
Procedure PB_PanelParentCB(hwnd,msg,wparam,lparam) 
   Protected *pud.PB_Panel_User_Data    
   Protected *dis.DRAWITEMSTRUCT 
   Protected shWnd.i 
   Protected callback.i = GetProp_(hWnd,"_oldCallback") 
   Protected fore.l,back.l,backbrush.l,text.s 
    
    
   If #WM_DESTROY = msg                     		
      SetWindowLongPtr_(hWnd,#GWL_WNDPROC,callback) 
      RemoveProp_(hwnd,"_oldCallback")
   EndIf 
    
   If #WM_DRAWITEM = msg 
      *dis = lParam 
      If *dis\CtlType = #ODT_TAB 
         shWnd = PB_GetPanelStaticItem(IsGadget(*dis\CtlID),*dis\itemID) 
         *pud  = GetWindowLongPtr_(shWnd,#GWL_USERDATA)    
        
        If *pud                      
           fore = *pud\ForeColor 
           back = *pud\BackColor 
            
           If back = #PB_Default 
              back = GetSysColor_(#COLOR_BTNFACE)              
           EndIf 
            
           If fore = #PB_Default 
              fore = GetSysColor_(#COLOR_BTNTEXT)              
           EndIf            
            
        Else                    
           fore = GetSysColor_(#COLOR_BTNTEXT) 
           back = GetSysColor_(#COLOR_BTNFACE) 
        EndIf 
                
         backbrush = CreateSolidBrush_(back) 
          
         fore = SetTextColor_(*dis\hdc, fore)                
         FillRect_(*dis\hdc, *dis\rcItem, backbrush) 
         SetBkMode_(*dis\hdc, #TRANSPARENT) 
         text = GetGadgetItemText(*dis\CtlID,*dis\ItemID)                                  
         DrawText_(*dis\hdc, text, Len(text), *dis\rcItem, #DT_CENTER | #DT_SINGLELINE | #DT_VCENTER)            
         DeleteObject_(backbrush)            
          SetTextColor_(*dis\hdc, fore) 
          
          ProcedureReturn  0 
          
         EndIf 
          
   EndIf 
    
    
   ProcedureReturn CallWindowProc_(callback,hwnd,msg,wparam,lparam) 
EndProcedure 
 
Procedure PB_GetPanelStaticItem(*gadget.PB_Gadget   ,item) 
  Protected tci.TC_ITEM\mask = #TCIF_PARAM 
  If SendMessage_(*gadget\gadget   ,#TCM_GETITEM   ,item   ,@tci) 
    ProcedureReturn tci\lParam 
  EndIf 
EndProcedure 
 
Procedure PB_SetGadgetItemColor(*Gadget.PB_Gadget,item.l,ColorType.l,Color,col.l)    
   Protected hwnd = PB_GetPanelStaticItem(*gadget,item) 
   Protected *pud.PB_Panel_User_Data 
   Protected result.l,panel_callback.i 
    
   *pud = GetWindowLongPtr_(hwnd   ,#GWL_USERDATA) 
      
   If Not *pud 
      *pud = AllocateMemory(SizeOf(PB_Panel_User_Data)) 
      
      If Not *pud ; no memory 
         ProcedureReturn 0 
      EndIf 
      
      SetWindowLongPtr_(hwnd   ,#GWL_USERDATA,*pud) 
      *pud\static_callback = SetWindowLongPtr_(hwnd,#GWL_WNDPROC,@PB_PanelStaticCB()) 
      *pud\ForeColor = -1 
      *pud\BackColor = -1      
      
   EndIf 
    
   panel_callback = GetProp_(GetParent_(*Gadget\gadget),"_oldCallback") 
    
   If Not panel_callback 
      panel_callback = SetWindowLongPtr_(GetParent_(*Gadget\gadget),#GWL_WNDPROC,@PB_PanelParentCB()) 
   EndIf    
    
   SetWindowLongPtr_(*Gadget\gadget, #GWL_STYLE, GetWindowLongPtr_(*Gadget\gadget, #GWL_STYLE) | #TCS_OWNERDRAWFIXED) 
    
   SetProp_(GetParent_(*Gadget\gadget),"_oldCallback",panel_callback)      
    
   Select ColorType 
      Case #PB_Gadget_FrontColor 
         *pud\ForeColor = color 
      Case #PB_Gadget_BackColor 
         *pud\BackColor  = color 
   EndSelect 
          
   SetWindowPos_(*Gadget\gadget,0,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE|#SWP_NOZORDER|#SWP_FRAMECHANGED)      
EndProcedure 
 
Procedure PB_GetGadgetItemColor(*Gadget.PB_Gadget,item.l,ColorType.l,col.l)    
   Protected hwnd = PB_GetPanelStaticItem(*gadget,item) 
   Protected *pud.PB_Panel_User_Data 
   Protected result.l 
    
   *pud = GetWindowLongPtr_(hwnd   ,#GWL_USERDATA) 
      
   Select ColorType 
      Case #PB_Gadget_FrontColor 
         result = *pud\ForeColor 
      Case #PB_Gadget_BackColor 
         result = *pud\BackColor 
   EndSelect    
    
   ProcedureReturn result 
EndProcedure 
 
Procedure PB_GetGadgetItemData(*gadget.PB_Gadget   ,item) 
   Protected hwnd = PB_GetPanelStaticItem(*gadget   ,item) 
   Protected *pud.PB_Panel_User_Data    
   If hwnd 
      *pud = GetWindowLongPtr_(hwnd   ,#GWL_USERDATA)      
      If *pud 
         ProcedureReturn *pud\user_data 
      EndIf 
   EndIf 
EndProcedure 
 
Procedure PB_SetGadgetItemData(*gadget.PB_Gadget,item,value) 
   Protected hwnd = PB_GetPanelStaticItem(*gadget,item) 
   Protected *pud.PB_Panel_User_Data 
   Protected result.l 
    
   *pud = GetWindowLongPtr_(hwnd,#GWL_USERDATA) 
    
   If Not *pud 
      *pud = AllocateMemory(SizeOf(PB_Panel_User_Data)) 
      
      If Not *pud ; no memory 
         ProcedureReturn 0 
      EndIf 
            
      SetWindowLongPtr_(hwnd   ,#GWL_USERDATA,*pud) 
      *pud\static_callback = SetWindowLongPtr_(hwnd,#GWL_WNDPROC,@PB_PanelStaticCB()) 
      *pud\ForeColor = -1 
      *pud\BackColor = -1 
   EndIf 
    
   result              =    *pud\user_data      
   *pud\user_data =    value    
    
   ProcedureReturn result 
EndProcedure 
 
Procedure PB_PanelGadget(id.i   ,x.l   ,y.l   ,cx.l   ,cy.l) 
   Protected value = PanelGadget(id,x,y,cx,cy) 
   Protected *gadget.PB_Gadget 
    
   If id = #PB_Any 
      id = value 
   EndIf 
    
   *gadget = IsGadget(id) 
    
   If *gadget 
      *gadget\vt\SetGadgetItemData   = @PB_SetGadgetItemData() 
      *gadget\vt\GetGadgetItemData   = @PB_GetGadgetItemData() 
      *gadget\vt\SetGadgetItemColor2 = @PB_SetGadgetItemColor() 
      *gadget\vt\GetGadgetItemColor2 = @PB_GetGadgetItemColor() 
   EndIf 
    
   ProcedureReturn value 
EndProcedure 
 
Macro PanelGadget 
   PB_PanelGadget 
EndMacro 

Sollte jetzt gehen :wink:

// edit
kleinere Fehler beseitigt.
Zuletzt geändert von ts-soft am 05.01.2011 13:22, insgesamt 1-mal geändert.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Lord
Beiträge: 324
Registriert: 21.01.2008 19:11

Re: SetGadgetItemData & SetGadgetItemColor fuer Panel

Beitrag von Lord »

Das war jetzt wirklich edel schnelle Hilfe.
Die Include läuft jetzt wieder wie sie soll.
Ich danke Dir dafür. :allright:
Bild
Antworten