Vorschau Fensterumriss bei Größenänderung

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
RangeControl
Beiträge: 2
Registriert: 14.05.2011 17:31
Wohnort: Mönchengladbach

Vorschau Fensterumriss bei Größenänderung

Beitrag von RangeControl »

In dem Code unten erstelle ich ein rahmenloses Fenster ohne Titelzeile, daß sich in der Größe verändern läßt.
Die Größenänderung findet bei gedrücktem Mausknopf sofort statt (bei Verkleinerung bei mir leider mit Flackereffect).
Ich möchte daher eine Vorschau der neuen Fensterdimensionen durch eine Punklinie realisieren, bevor sich das
Fenster nach dem Loslassen des Mausknopfes resized wird (a lá WINAMP)
In Forum konnte ich leider nichts verwertbares finden. Hat da jemand vielleicht eine Idee ?

Code: Alles auswählen




Macro HeiWord(long)
  (long >> 16) & $FFFF
EndMacro
Macro LowWord(long)
  long & $FFFF
EndMacro

Procedure NCHTest(hCtl,lParam)

    Protected pt.POINT
    Protected rc.RECT
    pt\x = LowWord(lParam)
    pt\y = HeiWord(lParam)
    ScreenToClient_(hCtl,pt)
    GetWindowRect_(hCtl,rc)

    If pt\y < 3 And pt\x < 3
        Result = #HTTOPLEFT
    ElseIf pt\y < 3 And pt\x >= (rc\right-rc\left-3)
        Result = #HTTOPRIGHT
    ElseIf pt\y >=(rc\bottom-rc\top-3) And pt\x >= (rc\right-rc\left-3)
        Result = #HTBOTTOMRIGHT
    ElseIf pt\x < 3 And pt\y >= (rc\bottom -rc\top - 3)
        Result = #HTBOTTOMLEFT
    ElseIf pt\y < 3
        Result = #HTTOP
    ElseIf pt\x < 3
        Result = #HTLEFT
    ElseIf pt\x >= (rc\right -rc\left - 3)
        Result = #HTRIGHT
    ElseIf pt\y >= (rc\bottom -rc\top - 3)
        Result = #HTBOTTOM
    Else
        Result = #HTCAPTION
           
    EndIf


    ProcedureReturn Result

EndProcedure


Procedure AMPCallback(WindowID,Message,wParam,lParam) 

 Result = #PB_ProcessPureBasicEvents


 Select Message

   Case #WM_NCHITTEST :Result = NCHTest(WindowID,lParam):

EndSelect

 ProcedureReturn Result

EndProcedure




Procedure Mainprog(winXpos.l,winYpos.l,winWidth.l,winHight.l)
  hWnd = OpenWindow(0,winXpos ,winYpos ,winWidth, winHight, "NCHTEST", #PB_Window_BorderLess |#WS_POPUP | #TTS_NOPREFIX        )
  SetWindowCallback(@AMPCallback(),0) 

  SetWindowColor(0,$513F16)

  Repeat
   EventID0 = WaitWindowEvent(5)
  Until EventID0 = #PB_Event_CloseWindow

EndProcedure


winposX = 200:winposY = 300:winWidth = 1100:winHight = 600:
Mainprog(winposX,winposY,winWidth,winHight)
Ein Computer ist die Ansammlung aller Gemeinheiten, die Gott bei den Frauen nicht mehr unterbringen konnte. ...
Benutzeravatar
RangeControl
Beiträge: 2
Registriert: 14.05.2011 17:31
Wohnort: Mönchengladbach

Re: Vorschau Fensterumriss bei Größenänderung (gelöst)

Beitrag von RangeControl »

Ok, hab´s dann doch noch selbst hinbekommen.
Falls es jemanden interessiert, hier der Code !

Code: Alles auswählen

Global OldSetting,settingToOld.b,cheksetting.b


Macro HeiWord(long)
  (long >> 16) & $FFFF
EndMacro
Macro LowWord(long)
  long & $FFFF
EndMacro

Procedure NCHTest(hCtl,lParam)

    Protected pt.POINT
    Protected rc.RECT
    pt\x = LowWord(lParam)
    pt\y = HeiWord(lParam)
    ScreenToClient_(hCtl,pt)
    GetWindowRect_(hCtl,rc)

    If pt\y < 3 And pt\x < 3
        Result = #HTTOPLEFT
    ElseIf pt\y < 3 And pt\x >= (rc\right-rc\left-3)
        Result = #HTTOPRIGHT
    ElseIf pt\y >=(rc\bottom-rc\top-3) And pt\x >= (rc\right-rc\left-3)
        Result = #HTBOTTOMRIGHT
    ElseIf pt\x < 3 And pt\y >= (rc\bottom -rc\top - 3)
        Result = #HTBOTTOMLEFT
    ElseIf pt\y < 3
        Result = #HTTOP
    ElseIf pt\x < 3
        Result = #HTLEFT
    ElseIf pt\x >= (rc\right -rc\left - 3)
        Result = #HTRIGHT
    ElseIf pt\y >= (rc\bottom -rc\top - 3)
        Result = #HTBOTTOM
    Else
        Result = #HTCAPTION
           
    EndIf

    ProcedureReturn Result

EndProcedure


Procedure AMPCallback(WindowID,Message,wParam,lParam) 

 Result = #PB_ProcessPureBasicEvents
 Select cheksetting
  Case #False: 
                SystemParametersInfo_(#SPI_GETDRAGFULLWINDOWS, 0, @OldSetting, 0);überprüft den Flag Visuelle Effekte "Fensterinhalt beim Ziehen anzeigen"
                cheksetting = #True
 EndSelect 
;  
 Select Message
   Case #WM_NCHITTEST :Result = NCHTest(WindowID,lParam):
                       Select Result
                         Case #HTCAPTION:
                            Select settingToOld
                              Case #True:
                                 Select OldSetting
                                  Case #True:
                                           SystemParametersInfo_(#SPI_SETDRAGFULLWINDOWS, 1,0,  #SPIF_UPDATEINIFILE);setzt den Flag Visuelle Effekte "Fensterinhalt beim Ziehen anzeigen"
                                           settingToOld = #False
                                           cheksetting = #False
                                 EndSelect 
                           EndSelect  
   
                         Default : 
                            Select OldSetting
                              Case #True:
                                         SystemParametersInfo_(#SPI_SETDRAGFULLWINDOWS, 0,0, #SPIF_UPDATEINIFILE);löscht den Flag Visuelle Effekte "Fensterinhalt beim Ziehen anzeigen"
                                         settingToOld = #True
                            EndSelect
;               
                       EndSelect 
 EndSelect

 ProcedureReturn Result

EndProcedure




Procedure Mainprog(winXpos.l,winYpos.l,winWidth.l,winHight.l)
  hWnd = OpenWindow(0,winXpos ,winYpos ,winWidth, winHight, "NCHTEST", #PB_Window_BorderLess |#WS_POPUP | #TTS_NOPREFIX        )
  SetWindowCallback(@AMPCallback(),0) 

  SetWindowColor(0,$513F16)
  ButtonGadget(0, 800, 500, 100, 20, "Quit")
  Repeat
   EventID0 = WaitWindowEvent(5)
   Select EventID0
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 0:EventID0 = #PB_Event_CloseWindow
      EndSelect  
   EndSelect 
  Until EventID0 = #PB_Event_CloseWindow

EndProcedure


winposX = 200:winposY = 300:winWidth = 1100:winHight = 600:
Mainprog(winposX,winposY,winWidth,winHight)
__________________________________________________
Code-Tags angepasst
04.08.2012
RSBasic
Ein Computer ist die Ansammlung aller Gemeinheiten, die Gott bei den Frauen nicht mehr unterbringen konnte. ...
Benutzeravatar
HeX0R
Beiträge: 3070
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Vorschau Fensterumriss bei Größenänderung

Beitrag von HeX0R »

Vielleicht solltest du noch deine HeiWord-Procedure in HighWord, oder HiWord umbenennen.
Irgendwie schüttelt es mich immer, wenn ich das sehe ;)
Antworten