Seite 2 von 2

Re: Doppelklick auf Gadget

Verfasst: 30.12.2010 17:38
von Velindos
Hallo,
hört sich gut an! Haben gerade so vor mich hin siniert, zum Beispiel Strg+Linker Klick mit Mouse auf Stringgadet wäre noch möglich um im OS zu bleiben. Wie das geht habe ich keine Ahnung, genau wie vorher, also nicht mein Tag!
Gruss ... Velindos

Re: Doppelklick auf Gadget

Verfasst: 01.02.2011 19:32
von Velindos
Hallo,
richte gerade über verschiedene Lösungen.
Hier ein fertiges Beispiel für den Doppelklick auf Editor-, Image- & Stringgadget.

Code: Alles auswählen

EnableExplicit

Global DPLCLICKSTRING
Global DPLCLICKIMAGE
Global DPLCLICKEDITOR
Global gOldEditProc
Global test

Procedure DPLCLICKSTRING(hWnd, uMsg, wParam, lParam)
  Protected result
    Select uMsg
        Case #WM_LBUTTONDBLCLK
          MessageRequester("Ausgabe", "Links doppelt geklickt stringgadget")
          result = 0
      Default
        result = CallWindowProc_(gOldEditProc, hWnd, uMsg, wParam, lParam)
    EndSelect
ProcedureReturn result
EndProcedure

Procedure DPLCLICKIMAGE(hWnd, uMsg, wParam, lParam)
  Protected result
    Select uMsg
        Case #WM_LBUTTONDBLCLK
          MessageRequester("Ausgabe", "Links doppelt geklickt auf Image")
          result = 0
      Default
        result = CallWindowProc_(gOldEditProc, hWnd, uMsg, wParam, lParam)
    EndSelect
ProcedureReturn result
EndProcedure

Procedure DPLCLICKEDITOR(hWnd, uMsg, wParam, lParam)
  Protected result
    Select uMsg
        Case #WM_LBUTTONDBLCLK
          MessageRequester("Ausgabe", "Links doppelt geklickt auf Editorgadgeet")
          result = 0
      Default
        result = CallWindowProc_(gOldEditProc, hWnd, uMsg, wParam, lParam)
    EndSelect
ProcedureReturn result
EndProcedure


If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
  StringGadget(1,10,10,200,20,"Klicke doppelt linke Maustaste...",0)
  ImageGadget (2,280,50,70,70,test, #PB_Image_Border )
  EditorGadget(3, 120, 50, 150, 140)

  gOldEditProc = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @DPLCLICKSTRING())
  gOldEditProc = SetWindowLongPtr_(GadgetID(2), #GWL_WNDPROC, @DPLCLICKIMAGE())
  gOldEditProc = SetWindowLongPtr_(GadgetID(3), #GWL_WNDPROC, @DPLCLICKEDITOR())

  Repeat
    Define Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Gruss ... Velindos

Re: Doppelklick auf Gadget

Verfasst: 04.02.2011 03:02
von edel
Der Aufbau des Callbacks ist nicht so optimal. Wenn der Doppelklick abgefangen werden aber dennoch markieren soll, darf man nicht 0 zurueck geben, sondern den Rueckgabewert von CallWindowProc_.

Code: Alles auswählen

PROCEDURE editproc(hWnd, uMsg, wParam, lParam)
  PROTECTED result
  
  IF uMsg = #WM_LBUTTONDBLCLK
      DEBUG "Links doppelt geklickt"     
  ENDIF
    
  PROCEDURERETURN CallWindowProc_(gOldEditProc, hWnd, uMsg, wParam, lParam)
ENDPROCEDURE


Re: Doppelklick auf Gadget

Verfasst: 05.02.2011 18:01
von Velindos
Hallo,
habs in die obige Source eingebaut, funtkioniert aber nicht, löst ständig aus!
Gruss Velindos

Re: Doppelklick auf Gadget

Verfasst: 05.02.2011 19:35
von edel
Der ganze Code ist eh vermurkst.

Code: Alles auswählen

  gOldEditProc = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @DPLCLICKSTRING())
  gOldEditProc = SetWindowLongPtr_(GadgetID(2), #GWL_WNDPROC, @DPLCLICKIMAGE())
  gOldEditProc = SetWindowLongPtr_(GadgetID(3), #GWL_WNDPROC, @DPLCLICKEDITOR())
Du uberschreibst gOldEditProc, somit kommt es sicherlich zu einem Fehlverhalten.