Page 1 of 1

Any chance to make a borderless window sizeable?

Posted: Tue May 21, 2024 9:48 pm
by es_91
Hi

#PB_Window_BorderLess disables any #PB_Window_SizeGadget functionalities... so to say.

It's not implemented to have a frame-less window do any resizing, except the maximizing and restoring.

I want to create an owner-drawn windows frame but i do not know how to code a proper resizing job. I'd need to (1) change the mouse cursor and (2) resize and redraw the window content every mouse movement made. How to change the cursor?

Any help or even a workaround for this? Just wanted to toy with some owner-made frames.

Re: Any chance to make a borderless window sizeable?

Posted: Tue May 21, 2024 10:06 pm
by Michael Vogel

Code: Select all

sizewe   = LoadCursor_(0, #IDC_SIZEWE)
sizeall  = LoadCursor_(0, #IDC_SIZEALL)
sizenwse = LoadCursor_(0, #IDC_SIZENWSE)
sizenesw = LoadCursor_(0, #IDC_SIZENESW)
sizens   = LoadCursor_(0, #IDC_SIZENS)
arrow    = LoadCursor_(0, #IDC_ARROW)

OpenWindow(0,0,0,320,240,"",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
ButtonGadget(0, WindowWidth(0)/2-30, WindowHeight(0)-40, 60, 20, "Close")

quit = 0
Repeat
	ev = WaitWindowEvent()
	Select ev

	Case #PB_Event_Gadget
		quit = 1

	Case #WM_SIZE
		ResizeGadget(0, WindowWidth(0)/2-30, WindowHeight(0)-40, #PB_Ignore, #PB_Ignore)

	Case #WM_MOUSEMOVE
		x = WindowMouseX(0)
		y = WindowMouseY(0)

		If GetAsyncKeyState_(#VK_LBUTTON) & 32768 = 0
			If y> 0 And y < 20
				sizing = 7
				SetCursor_(sizeall)
			Else
				sizing = 0
			EndIf

			If Not sizing
				If WindowWidth(0)-x <= 6
					If WindowHeight(0)-y <= 6 ; nwse
						SetCursor_(sizenwse)
						sizing = 3
					Else ; we
						SetCursor_(sizewe)
						sizing = 2
					EndIf
				Else
					sizing = 0
				EndIf
			EndIf

			If Not sizing
				If x <= 6
					If WindowHeight(0)-y <= 6
						SetCursor_(sizenesw)
						sizing = 5
					Else ; we
						SetCursor_(sizewe)
						sizing = 6
					EndIf
				Else
					sizing = 0
				EndIf
			EndIf

			If Not sizing
				If WindowHeight(0)-y <= 6
					If WindowWidth(0)-x <= 6 ; nwse
						SetCursor_(sizenwse)
						sizing = 3
					ElseIf x <= 6
						SetCursor_(sizenesw)
						sizing = 5
					Else ; ns
						SetCursor_(sizens)
						sizing = 4
					EndIf
				Else
					sizing = 0
				EndIf
			EndIf
		EndIf

		If x < 0 Or y < 0
			sizing = 0
			SetCursor_(arrow)
			SendMessage_(WindowID(0), #WM_LBUTTONUP, 0,0)
		EndIf

	Case #WM_LBUTTONDOWN
		Select sizing
		Case 2
			SetCursor_(sizewe)
			SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTRIGHT , #Null)
		Case 3
			SetCursor_(sizenwse)
			SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTBOTTOMRIGHT , #Null)
		Case 4
			SetCursor_(sizens)
			SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTBOTTOM , #Null)
		Case 5
			SetCursor_(sizenesw)
			SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTBOTTOMLEFT , #Null)
		Case 6
			SetCursor_(sizewe)
			SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTLEFT , #Null)
		Case 7
			SetCursor_(sizeall)
			SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION , #Null)
		EndSelect
	EndSelect

Until quit

Re: Any chance to make a borderless window sizeable?

Posted: Wed May 22, 2024 4:59 am
by es_91
This is a very beautiful code! Have so many thanks for that, Herr Vogel !!!! :mrgreen:

Re: Any chance to make a borderless window sizeable?

Posted: Wed May 22, 2024 12:48 pm
by Axolotl
yes.

Code: Select all


;/---
;| Change sizability of a window 
;| 
;| don't need the Flag #PB_Window_SizeGadget on OpenWindow() 
;| 
;\-

Procedure SizableWindow(Window, State)    ; State = #False or #True  .. 
  Protected hwnd 

  hwnd = WindowID(Window) 
  If State    ; == TRUE ------------------------------------------> add control 
    SetWindowLongPtr_(hwnd, #GWL_STYLE, GetWindowLongPtr_(hwnd, #GWL_STYLE) | #WS_THICKFRAME)     :Debug "Sizable = ON " 
  Else    ; == FALSE ---------------------------------------------> remove control 
    SetWindowLongPtr_(hwnd, #GWL_STYLE, GetWindowLongPtr_(hwnd, #GWL_STYLE) & ~#WS_THICKFRAME)    :Debug "Sizable = OFF "  
  EndIf 
  SetWindowPos_(hWnd, 0, 0, 0, 0, 0, #SWP_NOZORDER | #SWP_NOMOVE | #SWP_NOSIZE | #SWP_FRAMECHANGED)  
EndProcedure 


If OpenWindow(0, 0, 0, 240, 120, "Sizable ... ", #PB_Window_ScreenCentered | #PB_Window_BorderLess) 
  StickyWindow(0, 1)  ; don't hide the window behind the IDE :)  

  ButtonGadget(1,  2, 4, 72, 20, "Quit")  
  ButtonGadget(2, 80, 4, 72, 20, "Sizeable", #PB_Button_Toggle) 

  Repeat 
    Select WaitWindowEvent() 
      Case #PB_Event_CloseWindow  ; ALT+F4 works 
        Break 
      Case #PB_Event_Gadget 
        Select EventGadget() 
          Case 1 ; button Quit 
            Break 
          Case 2 ; button Sizeable 
            SizableWindow(0, GetGadgetState(2))  ; <--- 
        EndSelect
    EndSelect 
  ForEver 
EndIf 

Re: Any chance to make a borderless window sizeable?

Posted: Wed May 22, 2024 1:20 pm
by Axolotl
And of course you can also do this directly.....

Code: Select all

OpenWindow(0, 0, 0, 240, 120, "Sizable ... ", #PB_Window_ScreenCentered | #PB_Window_BorderLess | #WS_THICKFRAME)