Page 1 of 1
[Solved] Moving borderless window
Posted: Tue Jul 30, 2013 7:38 am
by SkyManager
Hi,
I want to move my gadget but it is not working.
Can anybody give me some clue about the problem?
Is there any fastest solution?
Code: Select all
Global StartMoving.l = #False
Global MovingMouseOffset.l = -1
Global LastMouseLocation.l = -1
Enumeration
#MainWindow
#MainContainer
#MoveButton
EndEnumeration
If OpenWindow(#MainWindow, 800, 0, 155, 25, "", #PB_Window_BorderLess)
ButtonGadget( #MoveButton, 1, 1, 30, 20, "Test")
Repeat
Event = WaitWindowEvent()
If StartMoving
xx.l = WindowMouseX(#MainWindow)
If Not LastMouseLocation = xx
LastMouseLocation = xx
xx = xx - MovingMouseOffset
Debug Str(xx)
ResizeWindow(#MainWindow, xx, 0, #PB_Ignore, #PB_Ignore)
EndIf
EndIf
If Event = #PB_Event_Gadget
SelectedGadget.l = EventGadget()
If SelectedGadget = #MoveButton
If StartMoving
StartMoving = #False
Debug "Stop Moving"
Else
StartMoving = #True
Debug "Start Moving"
MovingMouseOffset = WindowMouseX(#MainWindow) - WindowX(#MainWindow, #PB_Window_FrameCoordinate)
EndIf
EndIf
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Re: Moving gadget
Posted: Tue Jul 30, 2013 8:39 am
by roslansalleh
I think you should use resizegadget command to move the gadget.
Re: Moving gadget
Posted: Tue Jul 30, 2013 11:42 am
by TI-994A
SkyManager wrote:I want to move my gadget but it is not working..
..Is there any fastest solution?
Hello SkyManager. I believe that if a callback were implemented to capture the mouse messages, it might be faster, and perhaps more efficient too. However, it would result in an OS-dependent solution. This example, on the other hand, which is an adaptation of
an example that I posted in an earlier thread, is cross-platform:
Code: Select all
EnableExplicit
InitNetwork()
Enumeration
#MainWindow
#Button
#Label
#Image
EndEnumeration
Define wFlags, appQuit, dragOn, buttonMouseXOffset, buttonMouseYOffset
If ReceiveHTTPFile("https://dl.dropboxusercontent.com/u/38177172/PBHome.bmp",
GetTemporaryDirectory() + "PBHome.bmp")
LoadImage(#Image, GetTemporaryDirectory() + "PBHome.bmp")
wFlags = #PB_Window_SystemMenu |#PB_Window_ScreenCentered
OpenWindow(#MainWindow, #PB_Any, #PB_Any, 640, 480, "Drag&Drop Gadgets", wFlags)
TextGadget(#Label, 10, 10, 620, 30, "...click on the top-left corner of the " +
"button to move it, then click again to drop it at the new position.")
ButtonImageGadget(#Button, 20, 40, 200, 200, ImageID(#Image))
Repeat
If dragOn
ResizeGadget(#Button, WindowMouseX(#MainWindow) - buttonMouseXOffset,
WindowMouseY(#MainWindow) - buttonMouseYOffset, #PB_Ignore, #PB_Ignore)
EndIf
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
appQuit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case #Button
Select EventType()
Case #PB_EventType_LeftClick
If dragOn
dragon = 0
Else
buttonMouseXOffset = WindowMouseX(#MainWindow) +
-(GadgetX(#Button, #PB_Gadget_WindowCoordinate))
buttonMouseYOffset = WindowMouseY(#MainWindow) +
-(GadgetY(#button, #PB_Gadget_WindowCoordinate))
If buttonMouseXOffset < 20 And
buttonMouseYOffset < 20
dragOn = 1
EndIf
EndIf
EndSelect
EndSelect
EndSelect
Until appQuit = 1
EndIf
Unlike the
CanvasGadget() in my earlier example, some gadgets don't process mouse events like button up, button down, move, etc. As a workaround, this example activates the move event when the gadget is clicked on its extreme top-left corner, and dropped in its new location when clicked again, and uses the window's mouse coordinates to position the move. Easily adaptable to personal requirements.

Re: Moving gadget
Posted: Tue Jul 30, 2013 7:59 pm
by BasicallyPure
roslansalleh is correct. If you want to move a gadget you should use ResizeGadget(), not ResizeWindow().
IF you describe in detail what it is you want then someone can produce a working example.
As is, there is not enough information to determine exactly what you want.
Looking at your code makes me think you may be trying to move your entire window along the top of the desktop.
BP
Re: Moving gadget
Posted: Tue Jul 30, 2013 9:34 pm
by SkyManager
I am trying to move (relocate) the window
not one gadget
because inside the window, there are a dozen of gadgets
Re: Moving gadget
Posted: Wed Jul 31, 2013 4:02 am
by TI-994A
SkyManager wrote:I am trying to move (relocate) the window not one gadget
because inside the window, there are a dozen of gadgets
Hello again SkyManager. The thread title,
Moving Gadget, led me to assume that your requirement was to actually
move gadgets. In any case, here's the modified code to move the window
(programmatically at least):
Code: Select all
EnableExplicit
InitNetwork()
Enumeration
#MainWindow
#Button
#Label
#Image1
#Image2
EndEnumeration
Define wFlags, appQuit, dragOn, windowMouseXOffset, windowMouseYOffset
If ReceiveHTTPFile("https://dl.dropboxusercontent.com/u/38177172/bt1.bmp",
GetTemporaryDirectory() + "bt1.bmp") And
ReceiveHTTPFile("https://dl.dropboxusercontent.com/u/38177172/bt2.bmp",
GetTemporaryDirectory() + "bt2.bmp") And
LoadImage(#Image1, GetTemporaryDirectory() + "bt1.bmp")
LoadImage(#Image2, GetTemporaryDirectory() + "bt2.bmp")
wFlags = #PB_Window_SystemMenu |#PB_Window_ScreenCentered
OpenWindow(#MainWindow, #PB_Any, #PB_Any, 220, 200, "Move Window", wFlags)
TextGadget(#Label, 0, 10, 220, 30, "click on the button to move the window...", #PB_Text_Center)
ButtonImageGadget(#Button, 40, 40, 140, 125, ImageID(#Image1))
Repeat
If dragOn
ResizeWindow(#MainWindow, DesktopMouseX() - windowMouseXOffset,
DesktopMouseY() - windowMouseYOffset, #PB_Ignore, #PB_Ignore)
EndIf
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
appQuit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case #Button
Select EventType()
Case #PB_EventType_LeftClick
If dragOn
dragon = 0
SetGadgetAttribute(#Button, #PB_Button_Image, ImageID(#Image1))
Else
windowMouseXOffset = DesktopMouseX() - WindowX(#MainWindow)
windowMouseYOffset = DesktopMouseY() - WindowY(#MainWindow)
SetGadgetAttribute(#Button, #PB_Button_Image, ImageID(#Image2))
dragOn = 1
EndIf
EndSelect
EndSelect
EndSelect
Until appQuit = 1
EndIf
Hope this is what you're looking for.

Re: Moving gadget
Posted: Wed Jul 31, 2013 10:34 am
by SkyManager
Sorry for my title which misleading you.
I will try your suggestion.
Re: Moving gadget
Posted: Sat Aug 03, 2013 7:42 am
by BasicallyPure
@TI-994A
Thank you for the example.
Moving a borderless window is something I had never been able to do until I saw your example above.
I arranged it so now you can drag the window around while holding the mouse button down.
This binary counter has no practical use as far as I know, it's just for demonstration.
I have added a popup menu to use as a way to exit the program.
BP
Edit: fixed bug
Code: Select all
; BinaryCounter.pb
; Demonstrate how to drag a borderless window
; By BasicallyPure
; 8/4/2013
EnableExplicit
#MainWin = 0
#Canvas1 = 0
#PopUpMenu = 0
#MenuChoice_OnTop = 0
#MenuChoice_Quit = 1
Global Dim c(7)
c(0) = $FFFF00 : c(1) = $00FFFF : c(2) = $00FF00 : c(3) = $0000FF
c(4) = $FF00FF : c(5) = $FF0000 : c(6) = $808080 : c(7) = $FFFFFF
Declare INIT_GUI()
Declare UPDATE_COUNTER(k.i)
Declare EVENT_LOOP(count.i)
If INIT_GUI()
EVENT_LOOP(Date() << 3)
EndIf
; procedures
Procedure EVENT_LOOP(count.i)
Protected.i OffsetX, OffsetY, drag, TopState, Quit
Repeat
If drag ; move the window
ResizeWindow(#MainWin,DesktopMouseX()-OffsetX,DesktopMouseY()-OffsetY,#PB_Ignore,#PB_Ignore)
EndIf
Select WaitWindowEvent()
Case #PB_Event_CloseWindow : Quit = #True
Case #PB_Event_RightClick : DisplayPopupMenu(#PopUpMenu, WindowID(#MainWin))
Case #PB_Event_Timer : count + 1 : UPDATE_COUNTER(count)
Case #PB_Event_Menu
Select EventMenu()
Case #MenuChoice_OnTop : TopState ! 1
StickyWindow(#MainWin, TopState)
SetMenuItemState(#PopUpMenu, #MenuChoice_OnTop, TopState)
Case #MenuChoice_Quit : Quit = #True
EndSelect
Case #PB_Event_Gadget
If EventGadget() = #Canvas1
Select EventType()
Case #PB_EventType_LeftButtonDown
drag = #True
OffsetX = DesktopMouseX() - WindowX(#MainWin)
OffsetY = DesktopMouseY() - WindowY(#MainWin)
Case #PB_EventType_LeftButtonUp
drag = #False
Case #PB_EventType_RightButtonDown
DisplayPopupMenu(#PopUpMenu, WindowID(#MainWin))
EndSelect
EndIf
EndSelect
Until Quit
EndProcedure
Procedure UPDATE_COUNTER(k.i)
Protected.i x, c
StartDrawing(CanvasOutput(#Canvas1))
For x = 320 To 20 Step -20
If k & 1
Circle(x, 25, 6, c(c & %111))
Else
Circle(x, 25, 6, $106218)
EndIf
c + 1
k >> 1
Next
StopDrawing()
EndProcedure
Procedure INIT_GUI()
Protected flags.i = #PB_Window_ScreenCentered | #PB_Window_BorderLess
Protected Result.i = OpenWindow(#MainWin, 0, 0, 344, 54, "Clock", flags)
If Result
If CreatePopupMenu(#PopUpMenu)
MenuItem(#MenuChoice_OnTop, "Always on top")
MenuItem(#MenuChoice_Quit,"Quit")
Else : Result = 0
EndIf
If CanvasGadget(#Canvas1,2,2,340,50)
StartDrawing(CanvasOutput(#Canvas1))
Box(0,0,340,50,$350015)
StopDrawing()
Else : Result = 0
EndIf
If AddWindowTimer(#MainWin, 0, 125) = 0
Result = 0
EndIf
Else : Result = 0
EndIf
ProcedureReturn Result
EndProcedure
Re: Moving gadget
Posted: Sat Aug 03, 2013 10:25 am
by Demivec
@BasicallyPure: I run into problems using your code if I click the top left border of the window and try to move the window. It would seem I am technically outside of the window then and can never come back inside to drop the window. My mouse pointer then gains a permanent friend to follow it around the screen.
Here's a
link to some older code that is Windows specific and uses a windowed screen instead of a canvas gadget. It still functions without any modifications. I made some attempts at converting it to use a canvas gadget also but erred in the code to move the window. If I work it out later I may post that version also.
Re: Moving gadget
Posted: Sat Aug 03, 2013 6:03 pm
by BasicallyPure
@Demivec
Thanks for pointing out the bug.
It should be working ok now.
The problem was if you click on the border then drag the mouse anywhere over the canvas and release.
This gives a LeftButtonUp event without a LeftButtonDown event.
The way the code was written it would toggle drag on or off with either event and would get stuck when
it got an odd number of events.
BP
Re: Moving gadget
Posted: Sun Aug 04, 2013 2:05 am
by JHPJHP
Just another option (Windows Only)
Code: Select all
Global OffsetInfo.POINT
#WM_LBUTTONDOUBLECLICK = $203
Procedure WindowCallBack(hWnd, Msg, wParam, lParam)
Select Msg
Case #WM_LBUTTONDOWN
CursorInfo.POINT
If wParam = 1
SetCapture_(WindowID(0))
GetCursorPos_(CursorInfo)
OffsetInfo\x = CursorInfo\x - WindowX(0)
OffsetInfo\Y = CursorInfo\Y - WindowY(0)
EndIf
Case #WM_LBUTTONUP
ReleaseCapture_()
Case #WM_MOUSEMOVE
CursorInfo.POINT
If wParam = 1
GetCursorPos_(CursorInfo)
newX = CursorInfo\x - OffsetInfo\x
newY = CursorInfo\Y - OffsetInfo\Y
ResizeWindow(0, newX, newY, #PB_Ignore, #PB_Ignore)
EndIf
Case #WM_LBUTTONDOUBLECLICK
SendMessage_(WindowID(0), #PB_Event_CloseWindow, 0, 0)
EndSelect
ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure
If OpenWindow(0, 0, 0, 200, 200, "", #PB_Window_BorderLess | #PB_Window_ScreenCentered)
SetWindowCallback(@WindowCallBack())
TextGadget(0, 25, 70, 150, 20, "Double-Click to Close", #PB_Text_Center)
DisableGadget(0, 1)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
End
Re: Moving gadget
Posted: Sun Aug 04, 2013 12:46 pm
by RASHAD
Moving gadget or moving border less window ?
Code for moving gadget
Code: Select all
If OpenWindow(0, 0, 0, 700, 500, "Test", #PB_Window_SystemMenu|#PB_Window_ScreenCentered| #PB_Window_SizeGadget)
SetWindowColor(0,$BDBDBF)
StringGadget(1, 10, 10, 100, 60,"")
ButtonGadget(3,10,110,60,22,"TEST")
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case 3
If GetWindowLongPtr_(GadgetID(1), #GWL_STYLE) & #WS_THICKFRAME
SetWindowLongPtr_(GadgetID(1), #GWL_STYLE, GetWindowLongPtr_(GadgetID(1), #GWL_STYLE)&~ #WS_THICKFRAME)
ResizeGadget(1,GadgetX(1), GadgetY(1),GadgetWidth(1)-2, GadgetHeight(1)-2)
Else
SetWindowLongPtr_(GadgetID(1), #GWL_STYLE, GetWindowLongPtr_(GadgetID(1), #GWL_STYLE)|#WS_THICKFRAME)
ResizeGadget(1,GadgetX(1), GadgetY(1),GadgetWidth(1)-2, GadgetHeight(1)-2)
EndIf
EndSelect
Case #WM_CLOSE
Quit = 1
Case #WM_MOUSEMOVE
Gad = GetActiveGadget()
If Gad = 1 Or Gad = 3
ReleaseCapture_()
SendMessage_(GadgetID(Gad), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
MoveWindow_(GadgetID(Gad), GadgetX(Gad), GadgetY(Gad), GadgetWidth(Gad), GadgetHeight(Gad), 1)
EndIf
EndSelect
Until Quit = 1
EndIf
End
Re: Moving gadget
Posted: Sun Aug 04, 2013 1:41 pm
by SkyManager
Sorry for the incorrect captioned "Moving gadget" which misleads you
Actually, I want to move my borderless window.
Thanks all of you,
My window can be moved now.
Re: [Solved] Moving gadget
Posted: Wed Aug 14, 2013 6:03 am
by SkyManager
Hi everybody,
Thanks for all the expert advices
Finally, I have successfully created a test for moving my borderless window
My codes is attached herebelow, I hope it can help others.
Code: Select all
EnableExplicit
Global drag.l = #False
Global Quit.l = #False
Global OffsetX.l = 0
Global OffsetY.l = 0
Enumeration
#MainWin
#Label
EndEnumeration
If Not OpenWindow(#MainWin, 0, 0, 80, 25, "Clock", #PB_Window_ScreenCentered | #PB_Window_BorderLess)
End
EndIf
ButtonGadget(#Label,0,0,80,25,"Test")
SetGadgetColor(#Label,#PB_Gadget_BackColor,$00FFFF)
Repeat
If drag ; move the window
ResizeWindow(#MainWin, DesktopMouseX()-OffsetX, DesktopMouseY()-OffsetY, #PB_Ignore, #PB_Ignore)
EndIf
Select WaitWindowEvent()
Case #PB_Event_CloseWindow : Quit = #True
Case #PB_Event_Gadget
If EventGadget() = #Label
Select EventType()
Case #PB_EventType_LeftClick
If (drag)
drag = #False
Else
drag = #True
OffsetX = DesktopMouseX() - WindowX(#MainWin)
OffsetY = DesktopMouseY() - WindowY(#MainWin)
EndIf
EndSelect
EndIf
EndSelect
Until Quit