Fenstergröße ändern trotz #PB_Window_Borderless

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Beitrag 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.
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Beitrag 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
Zuletzt geändert von silbersurfer am 06.05.2016 10:09, insgesamt 1-mal geändert.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Beitrag 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
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Beitrag 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:
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Beitrag 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.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
udg
Beiträge: 566
Registriert: 20.06.2013 23:27

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Beitrag 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
PB v5.43 LTS + v6.02 LTS | Windows 7 x86 + 11 x64 - Gforce RTX 4090 - AMD Ryzen 9 5900X 12-Core Processor 4.2 GHz - 64,0 GB RAM,
ASUSTEK TUF Gaming X570 Plus
ASUS ROG Thor-1200P Platinum (1200W, Aura Sync, OLED Display, 0dB-Cooling)
1x 1 TByte Samsung MZ-V7S500BW 970 EVO Plus 1 TB NVMe M.2 Internal SSD
1x 2 TByte Samsung MZ-V7S2T0BW 970 EVO Plus 2 TB NVMe M.2 Internal SSD
von BiSONTE!. Kauft Hardware gern bei ihm.
Monitor:
LG 38GL950G-B 95 (38 Zoll) Ultragear Curved 21: 9 UltraWide QHD IPS
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Beitrag 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
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Beitrag 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
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Beitrag 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
a²+b²=mc²
Benutzeravatar
silbersurfer
Beiträge: 175
Registriert: 06.07.2014 12:21

Re: Fenstergröße ändern trotz #PB_Window_Borderless

Beitrag 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
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Antworten