Griff an SplitterBar tackern

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
dige
Beiträge: 1182
Registriert: 08.09.2004 08:53

Griff an SplitterBar tackern

Beitrag von dige »

Hallo in die Runde!

Ich überlege, wie ich den verschiebaren Balken des SplitterGadgets() besser sichtbar machen kann.
Das es sich wohl um ein PureBasic eigenes Control handelt, wird das nicht per API gehen.

Daher meine Überlegung, so etwas wie einen Griff über dem Balken anzuzeigen.

Meine Lösung ist aber nicht optimal. Kann man das besser machen?

Code: Alles auswählen

Enumeration
  #Button1
  #Button2
  #Splitter
  #Knob
EndEnumeration

Procedure IsMouseOver(hwnd)
  GetWindowRect_(hwnd,r.RECT)
  GetCursorPos_(P.POINT)
  Result = PtInRect_(r,P\y << 32 + P\x)
  ProcedureReturn Result
EndProcedure 

Procedure MoveSplitter()
  While GetAsyncKeyState_( #VK_LBUTTON ) & $8000 
    GetCursorPos_ (@P.POINT)
    ScreenToClient_ (WindowID(0), @P)     
    hwnd = ChildWindowFromPoint_ (GadgetID(#Splitter), P\y<< 32+P\x)
    
    SetGadgetState(#Splitter, P\y)
    ResizeGadget(#Knob, #PB_Ignore, P\y, #PB_Ignore, #PB_Ignore)
    
    UpdateWindow_(GadgetID(#Knob))
  Wend
EndProcedure

Procedure MoveKnob()
  ResizeGadget(#Knob, #PB_Ignore, GetGadgetState(#Splitter), #PB_Ignore, #PB_Ignore)
  UpdateWindow_(GadgetID(#Knob))
EndProcedure

If OpenWindow(0, 0, 0, 230, 195, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  
  ContainerGadget(#Button1, 0, 0, 220, 100, #PB_Container_Single)
    CloseGadgetList()
  
  ContainerGadget(#Button2, 0, 100, 230, 100, #PB_Container_Double)
    CloseGadgetList()    
    
  SplitterGadget(#Splitter, 0, 0, WindowWidth(0), WindowHeight(0), #Button1, #Button2, #PB_Splitter_Separator)
  
  ButtonGadget(3, WindowWidth(0)/2 - 20, WindowHeight(0)/2 - 5, 40, 15, "===" )
  
  SetParent_( GadgetID(#Knob), GadgetID(#Splitter))
  BindGadgetEvent(#Splitter, @MoveKnob(), #PB_EventType_LeftClick)
  
  Repeat
    Event = WaitWindowEvent()
    If GetAsyncKeyState_( #VK_LBUTTON ) & $8000
      If IsMouseOver(GadgetID(#Knob))
        MoveSplitter()
      EndIf
    EndIf
    
  Until Event = #PB_Event_CloseWindow
EndIf
"Papa, mein Wecker funktioniert nicht! Der weckert immer zu früh."