Seite 1 von 1

GetGadgetStructure

Verfasst: 16.08.2005 10:24
von Deeem2031
Hab mal wieder ein bischen in Purebasic rumgewühlt und dabei ist dieser (mehr oder weniger sinnvolle) Code bei rausgekommen:

Code: Alles auswählen

Structure GadgetFunctions
  FreeGadget.l
  GetGadgetState.l
  SetGadgetState.l
  GetGadgetText.l
  SetGadgetText.l
  AddGadgetItem.l
  AddGadgetItem2.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
EndStructure

Structure PB_GadgetStructure
  Gadget.l    ; OS Gadget pointer (HWND)
  *VirtualTable.GadgetFunctions
  CustomData.l  ; Can be used to store extra infos on this gadget
  CustomData2.l ; Can be used to store extra infos on this gadget
EndStructure

Procedure.l GetGadgetStructure(GadgetID)
  GadgetID(GadgetID)
  !MOV Eax, Edx
  ProcedureReturn
EndProcedure

;{ MyTextSetGadgetText
Global *Gadget.PB_GadgetStructure, Text.s

Goto MyTextSetGadgetText_End
MyTextSetGadgetText:
!LEA Eax, dword[Esp+4]
!MOV dword[p_Gadget],Eax 
!MOV Eax, dword[Esp+8]
!MOV dword[v_Text],Eax 

SetWindowText_(*Gadget\Gadget,":P")

!RET 08
MyTextSetGadgetText_End:;}

CreateGadgetList(OpenWindow(0,0,0,200,200,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,""))
TextGadget(0,90,90,20,20,"~")

*Gadget.PB_GadgetStructure = GetGadgetStructure(0)
Debug *Gadget\Gadget
Debug GadgetID(0)
*Gadget\VirtualTable\SetGadgetText = ?MyTextSetGadgetText
SetGadgetText(0,":)")

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      quit = 1
  EndSelect
Until quit

Verfasst: 16.08.2005 12:18
von NicTheQuick
Ich kapiers noch nicht so ganz.

Kannst du ein paar mehr Beispiele machen?

Verfasst: 16.08.2005 17:10
von remi_meier
Er überschreibt sozusagen die PB-Funktionen mit eigenen (eigentlich nur
die Pointer).

Nette Idee :allright:

Verfasst: 16.08.2005 18:33
von Deeem2031
Genau, ich hab die SetGadgetText() Proc von dem TextGadget überschrieben. Dadurch steht dann da als text ":P" und nicht ":)"
Nur die eigenen procs zu schreiben ist gewöhnungsbedürftig, schreibt man das nämlich ein eine "echte" Procedure, dann stürzt das Programm ab, da der interne Aufruf nicht zu dem Eax/Stack-Aufruf der PB-Procs passt.