Seite 1 von 1

Vorschau Fensterumriss bei Größenänderung

Verfasst: 28.07.2012 10:57
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)

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

Verfasst: 04.08.2012 12:18
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

Re: Vorschau Fensterumriss bei Größenänderung

Verfasst: 04.08.2012 13:12
von HeX0R
Vielleicht solltest du noch deine HeiWord-Procedure in HighWord, oder HiWord umbenennen.
Irgendwie schüttelt es mich immer, wenn ich das sehe ;)