Fenster und Gadgets anders Verwaltet

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.
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

Fenster und Gadgets anders Verwaltet

Beitrag von ts-soft »

Angeregt durch einen Code von hallodri :allright: hab ich mal folgendes Grundgerüst geschaffen.
Ein strukturierter Pointer (nicht ganz korrekt aber...) dient als GadgetID oder WindowID, in der Strukture selber befindet sich das hWnd von Windows. Das ganze kombiniert mit der normalen Vorgehensweise :mrgreen: . Ich hoffe, es kann jemand gebrauchen.

Code: Alles auswählen

Enumeration ; Windows
  #frmMain
EndEnumeration
Dim *Win.LONG(#PB_Compiler_EnumerationValue -1)

Enumeration ;Gadgets
  #btnOK
  #btnCancel
EndEnumeration
Dim *Gad.LONG(#PB_Compiler_EnumerationValue -1)

Procedure MyWindowCallback(WindowID, Message, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents
  Select Message
    Case #WM_COMMAND
      Debug GetDlgCtrlID_(GetFocus_())
      Debug GetFocus_()
  EndSelect
  ProcedureReturn Result
EndProcedure


*Win(#frmMain) = OpenWindow(#PB_Any, 0, 0, 200, 50, #PB_Window_ScreenCentered | #PB_Window_SystemMenu, "Test")
If *Win(#frmMain)
  SetWindowCallback(@MyWindowCallback()) 
  CreateGadgetList(*Win(#frmMain)\l) ; <-- in \l steckt das handle
  *Gad(#btnOK) = ButtonGadget(#PB_Any, 10, 10, 80, 30, "Ok")
  *Gad(#btnCancel) = ButtonGadget(#PB_Any, 100, 10, 80, 30, "Cancel")
  GadgetToolTip(*Gad(#btnOK), "Ich bin der Okay Button")
  GadgetToolTip(*Gad(#btnCancel), "Hier wird nicht abgebrochen")
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Break
      Case #PB_EventGadget
        Select EventGadgetID()
          Case *Gad(#btnOK)
            MessageRequester("Ok", "GadgetID: " + Str(*Gad(#btnOK)) + Chr(10) + "hWnd: " + Str(*Gad(#btnOK)\l))
          Case *Gad(#btnCancel)
            MessageRequester("Cancel", "GadgetID: " + Str(*Gad(#btnCancel)) + Chr(10) + "hWnd: " + Str(*Gad(#btnCancel)\l))
        EndSelect
    EndSelect
  ForEver
EndIf
PS: Das Callback dient nur der Demonstration und mit GadgetID ist die PB-Interne Nummer gemeint.

Wäre schön, wenn es in ähnlicher Form, also statt der Long-Struktur eine richtige Gadget-Structure, in PB4.0 umgesetzt wird. So das man anhand des Pointer (ObjektPointer?) immer alle Eigenschaften des Controls zur Verfügung hat.


Das verwenden der LONG Structur ist zwar nicht korrekt, funzt aber.
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