Seite 3 von 4

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Verfasst: 05.05.2016 04:34
von udg
@Ghosty1967
nimm am besten meinen Code mit der Überschrift: Edit Code angepasst.
ich habe alles in ein kleines Tool vereint. Sollte am anschaulichsten sein :)


@silbersurfer
Mausbuttons Abfragen geht, frage ist, ob das auf Dauer bei einem komplexeren Tool zu aufregend wird jedes Mal die Mouse UP und Down Events abzufragen ?
Man könnte da vielleicht noch mal an einer anderen Variante bauen. Ich werd mich da auch mal drüber hängen.
Jedoch, man-in-black seine Variante scheint da wohl eleganter zu sein den die Events, wie er schreibt, gehen nciht verloren. Muss mich da noch einmal reinhängen und auch genau testen :)

Alles klappt sehr gut bis auf die WindowBaund sache, denn wenn Ich das Manuel regel, kann dadurch die Maus
ausserhalb des Fenster liegen was dazu führt das die Event´s für das Fenster nicht mehr abgefragt werden
ist hier noch nicht passiert.

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Verfasst: 05.05.2016 07:39
von silbersurfer
@udg
Mausbuttons Abfragen geht, frage ist, ob das auf Dauer bei einem komplexeren Tool zu aufregend wird jedes Mal die Mouse UP und Down Events abzufragen ?
das wäre kein Problem, Ich habe mein Code auch überarbeitet und in richtung von Man-in-Black seinen Code umgestellt.
Dabei hatte Ich auch die WindowsBaund Procedure erweitert auf Max-werte des Fensters was alles super Funzt.

Bis auf die tatsache das wenn Ich beim vergrößern des Fenster´s, mit der Maus auserhalb des Fenster bei überschreiten der Max-werte liege, was ja normal ist.
Und Die Maustaste dann loslasse, wird dieser Event nicht Registriet.

deshalb die Frage ob es noch andere Metoden gibt den MausUp unabhängig vom Fenster abzufragen.

edit:
edit2: Änderung auf Nic´s anfrage :oops:
Hier das Beispiel was das veranschaulicht

Code: Alles auswählen

  EnableExplicit

  Enumeration
    #closeButton
    #TitleSide
    #ResizeButton
    #My_Window
  EndEnumeration

  CreateImage(#TitleSide,1900,20,32,0)
  If StartDrawing(ImageOutput(#TitleSide))
    Box(0,0,1900,20,$DEBC88)
    Box(2,2,1900,16,$9E6A33)
    Box(2,18,1900,2,$3F2633)
    StopDrawing()
  EndIf   
  CreateImage(#closeButton,20,20,32,RGB(255,0,0))
  If StartDrawing(ImageOutput(#closeButton))
    Box(0,0,20,20,$3F2633)   
    Box(2,2,16,16,$9E6A33)
    LineXY(2,2,16,16,$DABF96)
    LineXY(2,16,16,2,$DABF96)
    StopDrawing()
  EndIf   
  CreateImage(#ResizeButton,20,20,32,RGB(0,255,255))
  If StartDrawing(ImageOutput(#ResizeButton))
    Box(0,0,20,20,$DABF96)   
    LineXY(0,19,20,19,$A5562A) 
    LineXY(0,20,20,0,$A5562A)
    LineXY(19,0,19,20,$A5562A)
    FillArea(15,15,$A5562A,$B67653)
    StopDrawing()
  EndIf   
  
  Define Event.i,DmausX.i,DmausY.i,BackupMausX.i,BackupMausY.i,Resize.i,Drag.i,MinW.i=400,MinH.i=250,MaxW.i=800,MaxH=600,Mausklick.i
  If OpenWindow(0, 200, 200, 400, 250, "",#PB_Window_BorderLess)  
    SetWindowColor(0, $DABF96) 
    TextGadget(0, 10, 30, 190, 16, "") 
    SetGadgetColor(0, #PB_Gadget_BackColor,$DABF96)
    TextGadget(1, 10, 46, 190, 16, "")
    SetGadgetColor(1, #PB_Gadget_BackColor,$DABF96)
    ImageGadget(2,0,0,200,20,ImageID(#TitleSide))
    ResizeGadget(2,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,#PB_Ignore)
    ImageGadget(3,380,0,20,20,ImageID(#closeButton))
    ImageGadget(4,380,230,20,20,ImageID(#ResizeButton))
  EndIf
  
  

  
  ;Maus über ein rechteckigen Bereich abfragen 
  Procedure MausOver(Mx,My,x,y,w,h)
    If Mx>x And Mx< x+w And My>y And My<y+h
      ProcedureReturn #True
    EndIf 
  EndProcedure  
  ;Id=WindowID my/mx=MausX/MausY,w/h=Minmale Breite/Höhe mw/mh=Maximale Breite/Höhe
  Procedure WindowsBound(id,mx,my,w,h,mw,mh)  
    If mx<w And my>h And my<mh
      ResizeWindow(id,#PB_Ignore,#PB_Ignore, w, my)
    ElseIf mx>w And mx<mw And my<h
      ResizeWindow(id,#PB_Ignore,#PB_Ignore,mx,h)
    ElseIf mx>w And mx<mw And my>mh
      ResizeWindow(id,#PB_Ignore,#PB_Ignore, mx, mh)
    ElseIf mx>mw And my>h And my<mh
      ResizeWindow(id,#PB_Ignore,#PB_Ignore, mw, my)
    ElseIf mx>w And mx<mw And my>h And my<mh
      ResizeWindow(id,#PB_Ignore,#PB_Ignore, mx, my)
    ElseIf mx<w And my<h
      ResizeWindow(id,#PB_Ignore,#PB_Ignore, w,h)
    EndIf  
  EndProcedure  
  ;Bewegen des Window´s
  Procedure WindowMove()
    Shared DmausX,DmausY,BackupMausX,BackupMausY
    
    ResizeWindow(0, DmausX-BackupMausX, DmausY-BackupMausY, #PB_Ignore , #PB_Ignore )  
  EndProcedure
  ;Resizen des Window´s
  Procedure WindowResize()   
    Shared DmausX,DmausY,BackupMausX,BackupMausY,MinW,MinH,MaxW,MaxH
    
    WindowsBound(0,DmausX-BackupMausX,DmausY-BackupMausY,MinW,MinH,MaxW,MaxH) 
    ResizeGadget(2,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,#PB_Ignore)
    ResizeGadget(3,WindowWidth(0)-20,0,#PB_Ignore,#PB_Ignore)
    ResizeGadget(4,WindowWidth(0)-20,WindowHeight(0)-20,#PB_Ignore,#PB_Ignore)  
  EndProcedure 
  ;Mauskoordinten abfragen
  Procedure MausKoordinaten()
    Shared DmausX,DmausY
    
    DmausX=DesktopMouseX()
    DmausY=DesktopMouseY()   
  EndProcedure  
  ;Startoptionen für Window bewegen festlegen
  Procedure startmove()
    Shared drag,DmausX,DmausY,BackupMausX,BackupMausY
    
    Drag=#True
    BackupMausX=DmausX-WindowX(0)
    BackupMausY=DmausY-WindowY(0)   
  EndProcedure 
  ;Startoptionen für Window Resizen festlegen
  Procedure startResize()
    Shared Resize,DmausX,DmausY,BackupMausX,BackupMausY
    
    Resize=#True
    BackupMausX=DmausX-WindowWidth(0)
    BackupMausY=DmausY-WindowHeight(0)    
  EndProcedure 
  ;Window Schließen 
  Procedure WindowClose()
    End 
  EndProcedure  
  
  ;Event´s an die zugehörigen Proceduren Binden 
  BindGadgetEvent(2,@startmove()  ,#PB_EventType_LeftClick)
  BindGadgetEvent(3,@WindowClose(),#PB_EventType_LeftClick) 
  BindGadgetEvent(4,@startResize(),#PB_EventType_LeftClick)
  
  Repeat
    ;absolute Event holen
    Event = WaitWindowEvent()
    ;absoluten Koordinaten der Maus
    MausKoordinaten()
    SetGadgetText(0, "Desktop Maus-Position: "+Str(DesktopMouseX())+","+Str(DesktopMouseY()))
    ;check auf Drag oder Resize Activ
    If Drag=#True Or Resize=#True
      ;check auf linke Maustaste
      If event=#WM_LBUTTONDOWN 
        Repeat 
          ;Mauskoordinaten holen
          MausKoordinaten()
          If event<>#WM_PAINT
            If Resize=#True
              WindowResize()
            Else             
              Windowmove()
            EndIf 
          EndIf 
          If event=#WM_MOUSEMOVE
            SetGadgetText(0, "Desktop Maus-Position: "+Str(DesktopMouseX())+","+Str(DesktopMouseY()))
          EndIf   
          ;event abfangen
          event = WindowEvent()  
        Until  event=#WM_LBUTTONUP
        Resize=#False : Drag=#False
      EndIf 
    EndIf 
    
    Select event 
      Case #WM_LBUTTONDOWN 
        SetGadgetText(1,"linker Mausklick")
      Case #WM_LBUTTONUP
        SetGadgetText(1,"")
    EndSelect    
  ForEver

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Verfasst: 06.05.2016 02:31
von udg
Problem erkannt, jedoch kann ich den Fehler bei deinem vorangegangenem Code, dem älteren plus meinem Zutun nicht reproduzieren?
Hier geht kein Event verloren. Funzt hier super. Bild

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Verfasst: 06.05.2016 09:55
von NicTheQuick
Könnt ihr die Funktion bitte "WindowsBounds" nennen oder ähnlich, aber bitte nicht "Baund". Ich dachte irgendwann merkt ihr selbst, dass ihr es falsch schreibt, aber scheint nicht so. :wink:

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Verfasst: 06.05.2016 09:56
von silbersurfer
Hier geht kein Event verloren. Funzt hier super.
Es geht auch kein Event verloren, sondern es wird kein Event ausgegeben, da sich Die Maus ja nicht
beim loslassen der Maustaste innerhalb des Window´s befindetet.
Problem erkannt, jedoch kann ich den Fehler bei deinem vorangegangenem Code nicht reproduzieren?
Auch dort ist der Fehler schon vorhanden, nur das man dazu mit gehaltener Maustaste über Window X/Y Position ziehen muß
Um diesen dann zu erkennen
Könnt ihr die Funktion bitte "WindowsBounds" nennen oder ähnlich
Sorry Nic, das ist mir so noch garnicht aufgefallen, Danke ist somit geändert.

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Verfasst: 06.05.2016 15:24
von udg
Wegen WindowBaunds, ich hatte das ganze mal WindowBounds genannt, da hat purebasic gestreikt. Also nannte ich die Prozedur, WindowBinds.

"WindowBounds()" ist ja ein PB interner Befehl und wenn man diesen als Prozedurnamen benutzt und später aufruft, meckert PB, weil "WindowBounds" misbraucht wurde.

Bild


@silversurfer :)
ich dachte Du hast das mit Absicht so benannt, weil Du genau sonst diesen Error bekommen hattest.
War wohl ein falscher Felher, unbeabsichtigt ? :D

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Verfasst: 06.05.2016 17:53
von silbersurfer
ich dachte Du hast das mit Absicht so benannt, weil Du genau sonst diesen Error bekommen hattest.
Nein das war unabsichtlich udg, ich hatte nur ein s hinzufügen wollen Windowsbound orginal lautet es Ja WindowBounds

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Verfasst: 07.05.2016 12:16
von silbersurfer
Da keiner einen Lösungsvorschlag auf mein Problem zu finden scheint, und mir diese sache aber keine ruhe gelassen hat.
Habe Ich eine lösung gefunden, allerdings mit hilfe von Api !
Zwar ist sie nicht die Schönste aber Sie Funtz erst einmal

Code: Alles auswählen

  Procedure WindowResize()   
    Shared DmausX,DmausY,BackupMausX,BackupMausY,MinW,MinH,MaxW,MaxH
    Protected mx=DmausX-BackupMausX,my=DmausY-BackupMausY
    WindowsBound(0,DmausX-BackupMausX,DmausY-BackupMausY,MinW,MinH,MaxW,MaxH) 
    ResizeGadget(2,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,#PB_Ignore)
    ResizeGadget(3,WindowWidth(0)-20,0,#PB_Ignore,#PB_Ignore)
    ResizeGadget(4,WindowWidth(0)-20,WindowHeight(0)-20,#PB_Ignore,#PB_Ignore)  
    ;notlösung vieleicht gibt es da was besseres
    If mx<8 And my>8 And my<MaxH-10
      SetCursorPos_(WindowX(0)+8,DmausY)
    ElseIf mx>MaxW And my<MaxH And my>8
      SetCursorPos_(WindowX(0)+MaxW-10,DmausY)
    ElseIf my<8 And mx>8 And mx<MaxW-10
      SetCursorPos_(DmausX,WindowY(0)+8)
    ElseIf my>MaxH-1 And mx<MaxW And mx>8
      SetCursorPos_(DmausX,WindowY(0)+MaxH-10)
    ElseIf mx<8 And my<8
      SetCursorPos_(WindowX(0)+8,WindowY(0)+8)
    ElseIf mx>MaxW And my>MaxH
      SetCursorPos_(WindowX(0)+MaxW-10,WindowY(0)+MaxH-10)
    EndIf   
  EndProcedure 
dieser Code Schnipsel hält die Maus innerhalb von dem Fenster nach überschreiten der Max/Min werte

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Verfasst: 07.05.2016 13:09
von Kiffi
ich habe mir jetzt nicht alle Codes angeschaut, aber mir scheint folgende Lösung von Andreas recht praktikabel:

Code: Alles auswählen

EnableExplicit

Macro HiWord(long)
  (long >> 16) & $FFFF
EndMacro
Macro LoWord(long)
  long & $FFFF
EndMacro

Procedure HitTest(hCtl,lParam)
  Protected pt.POINT
  Protected rc.RECT
  Protected Result
  pt\x = LoWord(lParam)
  pt\y = HiWord(lParam)
  ScreenToClient_(hCtl,pt)
  GetWindowRect_(hCtl,rc)
  If pt\y < 4 And pt\x < 4
    Result = #HTTOPLEFT
  ElseIf pt\y < 4 And pt\x >= (rc\right-rc\left-4)
    Result = #HTTOPRIGHT
  ElseIf pt\y >=(rc\bottom-rc\top-4) And pt\x >= (rc\right-rc\left-4)
    Result = #HTBOTTOMRIGHT
  ElseIf pt\x < 4 And pt\y >= (rc\bottom -rc\top - 4)
    Result = #HTBOTTOMLEFT
  ElseIf pt\y < 4
    Result = #HTTOP
  ElseIf pt\x < 4
    Result = #HTLEFT
  ElseIf pt\x >= (rc\right -rc\left - 4)
    Result = #HTRIGHT
  ElseIf pt\y >= (rc\bottom -rc\top - 4)
    Result = #HTBOTTOM
  Else
    Result = #HTCAPTION
  EndIf
  ProcedureReturn Result
EndProcedure

Procedure WCB(wnd,msg,wparam,lparam)
  Protected Result
  Protected *MinMax.MINMAXINFO
  Result = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_NCHITTEST
      Result = HitTest(wnd,lParam)
    Case #WM_GETMINMAXINFO
      *MinMax = lParam
      *MinMax\ptMinTrackSize\x = 100 ; Min. Breite des Fensters
      *MinMax\ptMinTrackSize\y = 100 ; Min. Höhe des Fensters
      ProcedureReturn 0
  EndSelect
  ProcedureReturn Result
EndProcedure

OpenWindow(0, 100, 200, 195, 260, "PureBasic Window", #PB_Window_BorderLess)

ButtonGadget(1, 10,10,80,24,"Ende") 

TextGadget(2, 10, 40,180,200,"Schieb mich, vergroessere mich") 

Define EventID
Define Quit

SetWindowCallback(@WCB())
Repeat
  EventID = WaitWindowEvent()
  Select EventID
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1: Quit = 1
      EndSelect
    Case #PB_Event_CloseWindow
      Quit = 1
  EndSelect
Until Quit = 1
Grüße ... Peter

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Verfasst: 07.05.2016 13:32
von silbersurfer
@Kniffi
ch habe mir jetzt nicht alle Codes angeschaut, aber mir scheint folgende Lösung von Andreas recht praktikabel:
Na bitte,
Super Kniffi der Code Schnipsel ist genau das was fehlte :allright:
wusste doch das auf euch hier verlass ist...... :mrgreen: :mrgreen:

Gruss Silbersurfer