Seite 1 von 1

Canvasgadget als Container

Verfasst: 26.07.2012 16:58
von Josh
Hallo,

um auf einem Canvasgadget andere Gadgets zu setzen, habe ich den folgenden Code aus der Hilfe ergänzt. Sieht da wer Probleme?

Code: Alles auswählen

  If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 10, 10, 200, 200)

    LongPtr = GetWindowLongPtr_(GadgetID(0), #GWL_STYLE)
    SetWindowLongPtr_(GadgetID(0), #GWL_STYLE, LongPtr|#WS_CLIPCHILDREN)

    StringGadget (1, 10, 90, 180, 20, "Test")
    SetParent_ (GadgetID(1), GadgetID(0))

    Repeat
      Event = WaitWindowEvent()
          
      If Event = #PB_Event_Gadget And EventGadget() = 0 
        If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
          If StartDrawing(CanvasOutput(0))
            x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
            y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
            Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
            StopDrawing()
          EndIf
        EndIf
      EndIf    

    Until Event = #PB_Event_CloseWindow
  EndIf

Re: Canvasgadget als Container

Verfasst: 26.07.2012 17:07
von STARGÅTE
Also bei mir kann ich das StringGadget nur noch eingeschränkt nutzen (Problem?).
zB wird der Cursor vom Canvas übernommen und nicht der IBeam vom StringGadget.
Außerdem geht alles markieren mit einem Doppelklick nicht mehr.

Re: Canvasgadget als Container

Verfasst: 26.07.2012 17:10
von Josh
STARGÅTE hat geschrieben:Also bei mir kann ich das StringGadget nur noch eingeschränkt nutzen (Problem?).
zB wird der Cursor vom Canvas übernommen und nicht der IBeam vom StringGadget.
Außerdem geht alles markieren mit einem Doppelklick nicht mehr.
:cry:
Kann ich bei mir nicht nachvollziehen. Curser ist der IBeam und Doppelklick funktioniert wie gewohnt. Ich verwende Win7, getestet unter 32 und 64 bit.

Re: Canvasgadget als Container

Verfasst: 26.07.2012 17:14
von STARGÅTE
Hab hier XP, außerdem hatte ich das Canvas noch um
CanvasGadget(0, 10, 10, 200, 200, #PB_Canvas_Keyboard|#PB_Canvas_DrawFocus)
vervollständigt.
Dort ist zu erkennen das der Fokus bei einem Doppelklick im StringGadget auf das Canvas geht.

Re: Canvasgadget als Container

Verfasst: 26.07.2012 23:18
von Josh
Damit sollten die beiden Fehler behoben sein. Wenn noch jemanden was auffällt, bitte melden. Vieleicht kennt einer zu der Cursorg'schicht eine bessere Methode. Das mit dem Static gefällt mir nicht so unbedingt.

Code: Alles auswählen

  Global OldWinProc.i

  Procedure WinCallback (hWnd, uMsg, wParam, lParam)
    Static Cursor.i = -1
    Define Tme.TRACKMOUSEEVENT


    Select uMsg

      Case #WM_MOUSEMOVE ;notwendig, wenn kein XP Skin Support
        Tme\cbSize    = SizeOf (TRACKMOUSEEVENT)
        Tme\dwFlags   = #TME_LEAVE
        Tme\hwndTrack = hwnd
        TrackMouseEvent_(Tme)

      Case #WM_LBUTTONDBLCLK
        SetFocus_(hWnd)

      Case #WM_SETCURSOR
        If PeekW (@lParam) = #HTCLIENT
          If Cursor = -1
            Cursor = GetGadgetAttribute (0, #PB_Canvas_Cursor)
          EndIf
          SetGadgetAttribute (0, #PB_Canvas_Cursor, #PB_Cursor_IBeam)
        EndIf

      Case #WM_MOUSELEAVE
        SetGadgetAttribute (0, #PB_Canvas_Cursor, Cursor)
        Cursor = -1
    
    EndSelect

    ProcedureReturn CallWindowProc_(OldWinProc ,hWnd ,uMsg, wParam, lParam)

  EndProcedure
  
  If OpenWindow(0, 0, 0, 220, 220, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 10, 10, 200, 200, #PB_Canvas_Keyboard|#PB_Canvas_DrawFocus)

    LongPtr = GetWindowLongPtr_(GadgetID(0), #GWL_STYLE)
    SetWindowLongPtr_(GadgetID(0), #GWL_STYLE, LongPtr|#WS_CLIPCHILDREN)

    StringGadget (1, 10, 90, 180, 20, "Test")
    SetParent_ (GadgetID(1), GadgetID(0))

    OldWinProc = SetWindowLongPtr_ (GadgetID(1), #GWL_WNDPROC, @WinCallback())

    Repeat
      Event = WaitWindowEvent()
          
      If Event = #PB_Event_Gadget And EventGadget() = 0 
        If EventType() = #PB_EventType_LeftButtonDown Or (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(0, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
          If StartDrawing(CanvasOutput(0))
            x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
            y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
            Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
            StopDrawing()
          EndIf
        EndIf
      EndIf    

    Until Event = #PB_Event_CloseWindow
  EndIf
Edit 31.07.2012: TRACKMOUSEEVENT eingefügt

Re: Canvasgadget als Container

Verfasst: 06.08.2012 14:58
von Josh
RASHAD hat hier einen Code ohne Callback gepostet.