EmulateDialog windows only

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

EmulateDialog windows only

Beitrag von ts-soft »

Dieser Code basiert auf einem Beispiel von Justin: http://www.purebasic.fr/english/viewtop ... 11#p346411

Code: Alles auswählen

EnableExplicit

Procedure EmulateDialogCallback(hWnd, uMsg, wParam, lParam)
  Protected oldproc = GetProp_(hWnd, "oldproc")
  
  Select uMsg
    Case #WM_NCDESTROY
      RemoveProp_(hWnd, "oldproc")
    Case #WM_KEYDOWN
      Select GadgetType(GetDlgCtrlID_(hWnd))
        Case #PB_GadgetType_Button, #PB_GadgetType_ButtonImage
          If wParam = #VK_RETURN
            SendMessage_(hWnd, #BM_CLICK , 0, 0)
            ProcedureReturn 0
          EndIf
        Case #PB_GadgetType_String
          If wParam = #VK_RETURN
            SetFocus_(GetNextDlgTabItem_(GetParent_(hWnd), hWnd, #False))
            ProcedureReturn 0
          EndIf
        Case #PB_GadgetType_Option
          If wParam = #VK_DOWN
            SendMessage_(GetNextDlgGroupItem_(GetParent_(hWnd), hWnd, #False), #BM_CLICK , 0, 0)
            ProcedureReturn 0
          ElseIf wparam = #VK_UP
            SendMessage_(GetNextDlgGroupItem_(GetParent_(hWnd), hWnd, #True), #BM_CLICK , 0, 0)
            ProcedureReturn 0
          EndIf
      EndSelect
  EndSelect
  
  ProcedureReturn CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
EndProcedure

Procedure EmulateDialog(ID)
  Protected oldproc = SetWindowLongPtr_(GadgetID(ID), #GWL_WNDPROC, @EmulateDialogCallback())
  ProcedureReturn SetProp_(GadgetID(ID), "oldproc", oldproc)
EndProcedure

Procedure InitEmulateWin(ID)
  ProcedureReturn SendMessage_(WindowID(ID), #WM_CHANGEUISTATE, 2 | (1 << 16), 0)
EndProcedure

; Example

Define i
OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    
ButtonGadget(0, 10, 10, 200, 20, "Default Button")
StringGadget(1, 10, 40, 200, 20, "")
StringGadget(2, 10, 70, 200, 20, "")
OptionGadget(3, 10, 100, 60, 20, "Option 1")
OptionGadget(4, 10, 130, 60, 20, "Option 2")
OptionGadget(5, 10, 160, 60, 20, "Option 3")
SetGadgetState(3, 1)
SetActiveGadget(0)
For i = 0 To 5
  EmulateDialog(i)
Next

InitEmulateWin(0)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow : Break
    Case #PB_Event_Gadget
      Debug "Gadget: " + Str(EventGadget()) + " : Type: " + Str(EventType())
  EndSelect
ForEver
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
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: EmulateDialog windows only

Beitrag von bobobo »

:mrgreen: und niemand weiß was man damit anfangen soll ..
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
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: EmulateDialog windows only

Beitrag von ts-soft »

bobobo hat geschrieben::mrgreen: und niemand weiß was man damit anfangen soll ..
Ist der Code so schwer zu nutzen oder der Zweck nicht klar?

Gab doch schon des öfteren Anfragen, warum die Gadgets nicht auf Return reagieren,
weil viele das unterschiedliche Verhalten von Dialogen und Fenstern nicht verstehen.

Hiermit kann man ohne jeglichen Aufwand das Verhalten emulieren, aber warum sich da
keiner für interessiert :mrgreen:

Mir egal :lol:
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
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Re: EmulateDialog windows only

Beitrag von hjbremer »

ts-soft hat geschrieben: Hiermit kann man ohne jeglichen Aufwand das Verhalten emulieren, aber warum sich da
keiner für interessiert :mrgreen:
Mir egal :lol:
War vielleicht zuviel des Guten

hier mal etwas einfacher, nur Zahlen und Punkt erlaubt. Navigation mit Pfeiltasten und Return

Code: Alles auswählen

EnableExplicit

Procedure StringGadgetCallback(hWnd, uMsg, wParam, lParam)
   
   Protected oldproc = GetProp_(hWnd, "oldproc")
   Protected parent  = GetParent_(hWnd)
   
   Select uMsg
      Case #WM_NCDESTROY
         RemoveProp_(hWnd, "oldproc")
         
      Case #WM_KEYDOWN
         
         Select wParam 
            Case #VK_RETURN
               SetFocus_(GetNextDlgTabItem_(parent, hWnd, #False))
               ProcedureReturn 0
               
            Case #VK_DOWN
               SetFocus_(GetNextDlgTabItem_(parent, hWnd, #False))
               ProcedureReturn 0
               
            Case  #VK_UP
               SetFocus_(GetNextDlgTabItem_(parent, hWnd, #True))
               ProcedureReturn 0
               
         EndSelect
         
      Case #WM_CHAR
         
         Select wParam
            Case 44: wparam = 46          ;Komma wird Punkt
            Case 48 To 57                 ;erlaubt   
            Default: ProcedureReturn 0    ;tue nix
         EndSelect   
         
   EndSelect
   
   ProcedureReturn CallWindowProc_(oldproc, hWnd, uMsg, wParam, lParam)
EndProcedure

Procedure SubClassingStringGadgetWithSetProp(ID)
   Protected oldproc = SetWindowLongPtr_(GadgetID(ID), #GWL_WNDPROC, @StringGadgetCallback())
   ProcedureReturn SetProp_(GadgetID(ID), "oldproc", oldproc)
EndProcedure

; Example

Define i
OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

StringGadget(1, 10, 40, 200, 20, "")
StringGadget(2, 10, 70, 200, 20, "")
StringGadget(3, 10, 100, 200, 20, "")
StringGadget(4, 10, 130, 200, 20, "")
StringGadget(5, 10, 160, 200, 20, "")

SetActiveGadget(1)

For i = 1 To 5
   SubClassingStringGadgetWithSetProp(i)
Next

Repeat
   Select WaitWindowEvent()
      Case #PB_Event_CloseWindow : Break
      Case #PB_Event_Gadget
         ;Debug "Gadget: " + Str(EventGadget()) + " : Type: " + Str(EventType())
   EndSelect
ForEver
Purebasic 5.70 x86 5.72 X 64 - Windows 10

Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
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: EmulateDialog windows only

Beitrag von ts-soft »

Das man mit Pfeil rauf und runter von Text zu Text springen kann in Dialogen wäre mir Neu :mrgreen:
Aber ich bekomme so selten Dialoge zu Gesicht, das ich mir da nicht sicher bin.

Das mit dem Numeric-String könnte man ja noch einbauen, wenn der Style entsprechend gesetzt ist,
aber mir fehlt im Moment die Lust hier noch was zu ändern, wenn es eh keiner braucht.
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
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: EmulateDialog windows only

Beitrag von bobobo »

ts-soft hat geschrieben:
bobobo hat geschrieben::mrgreen: und niemand weiß was man damit anfangen soll ..
Ist der Code so schwer zu nutzen oder der Zweck nicht klar?
mir war es schon klar .. aber anderen wohl nicht .. ich wollte halt nur nochmal draufhinweisen
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten