Transfer a gadget to another window
-
- Enthusiast
- Posts: 169
- Joined: Sat Mar 14, 2015 11:53 am
Transfer a gadget to another window
Given this situation:
I got a log gadget window on my screen where the user sees what is being done.
After the actions of screen#1 are complete, the program moves on to screen#2.
Now how do I move that log gadget window over to the second screen? It is a standard ListViewGadget
I got a log gadget window on my screen where the user sees what is being done.
After the actions of screen#1 are complete, the program moves on to screen#2.
Now how do I move that log gadget window over to the second screen? It is a standard ListViewGadget
Re: Transfer a gadget to another window
You can use the SetParent api function, see https://learn.microsoft.com/en-us/windo ... -setparent
Code: Select all
If OpenWindow(0, 50, 50, 270, 140, "ListViewGadget1", #PB_Window_SystemMenu)
ListViewGadget(0, 10, 40, 250, 90)
ButtonGadget(1, 10, 10, 50, 25, "Click me")
OpenWindow(1, 400, 50, 270, 140, "ListViewGadget2", #PB_Window_SystemMenu)
For a = 1 To 12
AddGadgetItem (0, -1, "Item " + Str(a) + " of the Listview") ; define listview content
Next
SetGadgetState(0, 9) ; set (beginning with 0) the tenth item as the active one
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget And EventGadget() = 1
SetParent_(GadgetID(0), WindowID(1))
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
Re: Transfer a gadget to another window
here for all three OS
viewtopic.php?t=61028
viewtopic.php?t=61028
Re: Transfer a gadget to another window
I had made an example using SetParent (Windows) but spikey was faster.
But I have a strange behavior when it is done with OpenWindow/CloseWindow
When I switch windows the Listview background color is grey and If I use the Listview ScrollBar, it becomes black.
Do you have an explanation for this behavior ?
No problem if I use HideWindow True/False instead of Open(Close)Window.
But I have a strange behavior when it is done with OpenWindow/CloseWindow
When I switch windows the Listview background color is grey and If I use the Listview ScrollBar, it becomes black.
Do you have an explanation for this behavior ?
No problem if I use HideWindow True/False instead of Open(Close)Window.
Code: Select all
EnableExplicit
Enumeration Window
#Window_1
#Window_2
EndEnumeration
Enumeration Gadgets
#ListView
#Btn_Open_Window_1
#Btn_Open_Window_2
EndEnumeration
Procedure Open_Window_2(X = 0, Y = 0, Width = 360, Height = 240)
If OpenWindow(#Window_2, X, Y, Width, Height, "Window_2", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Btn_Open_Window_1, 20, 170, 320, 50, "Open_Window_1")
EndIf
EndProcedure
Procedure Open_Window_1(X = 0, Y = 0, Width = 360, Height = 240)
If OpenWindow(#Window_1, X, Y, Width, Height, "Window_1", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Btn_Open_Window_2, 20, 170, 320, 50, "Open_Window_2")
EndIf
EndProcedure
Define I.i
Open_Window_1()
ListViewGadget(#ListView, 20, 20, 320, 140)
For I=1 To 10
AddGadgetItem(#ListView, -1, "ListView Element " + Str(I))
Next
;Open_Window_2() : HideWindow(#Window_2, #True)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_Open_Window_1
Open_Window_1()
SetParent_(GadgetID(#ListView), WindowID(#Window_1))
CloseWindow(#Window_2)
;HideWindow(#Window_2, #True) : HideWindow(#Window_1, #False)
Case #Btn_Open_Window_2
Open_Window_2()
SetParent_(GadgetID(#ListView), WindowID(#Window_2))
CloseWindow(#Window_1)
;HideWindow(#Window_1, #True) : HideWindow(#Window_2, #False)
EndSelect
EndSelect
-
- Enthusiast
- Posts: 169
- Joined: Sat Mar 14, 2015 11:53 am
Re: Transfer a gadget to another window
Thank you, this works nicely. I have tried with your code and with mine.
BUT, one issue:
I had set bg and fg colors in that gadget and after "transferring" the colors look really broken, until I manually left-click each line. Only then bg and fg colors in that gadget are being restored.
What am I missing?
Re: Transfer a gadget to another window
Code: Select all
If OpenWindow(0, 50, 50, 270, 140, "ListViewGadget1", #PB_Window_SystemMenu)
ListViewGadget(0, 10, 40, 250, 90)
SetGadgetColor(0,#PB_Gadget_BackColor,0)
SetGadgetColor(0,#PB_Gadget_FrontColor,$FFFFFF)
ButtonGadget(1, 10, 10, 80, 24, "Click me")
For a = 1 To 12
AddGadgetItem (0, -1, "Item " + Str(a) + " of the Listview") ; define listview content
Next
SetGadgetState(0, 9) ; set (beginning with 0) the tenth item as the active one
OpenWindow(1, 400, 50, 270, 140, "ListViewGadget2", #PB_Window_SystemMenu)
UseGadgetList(WindowID(1))
ButtonGadget(2, 10, 10, 80, 24, "Click me")
UseGadgetList(WindowID(0))
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Quit = 1
Case #PB_Event_Gadget
Select EventGadget()
Case 1
SetWindowLongPtr_( GadgetID(0), #GWL_HWNDPARENT,WindowID(1))
Case 2
SetWindowLongPtr_( GadgetID(0), #GWL_HWNDPARENT,WindowID(0))
EndSelect
EndSelect
Until Quit = 1
EndIf
Egypt my love
Re: Transfer a gadget to another window
For ChrisR
Code: Select all
EnableExplicit
Enumeration Window
#Window_1
#Window_2
EndEnumeration
Enumeration Gadgets
#ListView
#Btn_Open_Window_1
#Btn_Open_Window_2
EndEnumeration
Procedure Open_Window_2(X = 0, Y = 0, Width = 360, Height = 240)
If OpenWindow(#Window_2, X, Y, Width, Height, "Window_2", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Btn_Open_Window_1, 20, 170, 320, 50, "Open_Window_1")
EndIf
EndProcedure
Procedure Open_Window_1(X = 0, Y = 0, Width = 360, Height = 240)
If OpenWindow(#Window_1, X, Y, Width, Height, "Window_1", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#Btn_Open_Window_2, 20, 170, 320, 50, "Open_Window_2")
EndIf
EndProcedure
Define I.i
Open_Window_1()
ListViewGadget(#ListView, 20, 20, 320, 140)
For I=1 To 10
AddGadgetItem(#ListView, -1, "ListView Element " + Str(I))
Next
Open_Window_2() : HideWindow(#Window_2, #True)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_Open_Window_1
LockWindowUpdate_(WindowID(#Window_2))
SetWindowLongPtr_( GadgetID(#ListView), #GWL_HWNDPARENT,WindowID(#Window_1))
HideWindow(#Window_2, #True) : HideWindow(#Window_1, #False)
LockWindowUpdate_(0)
Case #Btn_Open_Window_2
LockWindowUpdate_(WindowID(#Window_1))
HideWindow(#Window_1, #True) : HideWindow(#Window_2, #False)
SetWindowLongPtr_( GadgetID(#ListView), #GWL_HWNDPARENT,WindowID(#Window_2))
LockWindowUpdate_(0)
EndSelect
EndSelect
ForEver
Egypt my love
Re: Transfer a gadget to another window
Thanks RASHAD,
It allowed me to see the difference between SetParent and #GWL_HWNDPARENT (Owner).
Raymond Chen wrote a blog: A window can have a parent or an owner but not both
And a 2nd blog Why does my control send its notifications to the wrong window after I reparent it?
Based on the 2nd blog, if I got it ~right, it seems possible to change the parent and close the previous window as long as you go through a container.
It allowed me to see the difference between SetParent and #GWL_HWNDPARENT (Owner).
Raymond Chen wrote a blog: A window can have a parent or an owner but not both
And a 2nd blog Why does my control send its notifications to the wrong window after I reparent it?
Based on the 2nd blog, if I got it ~right, it seems possible to change the parent and close the previous window as long as you go through a container.
Code: Select all
EnableExplicit
Enumeration Window 1
#Window_1
#Window_2
EndEnumeration
Enumeration Gadgets
#Cont
#ListView
#Btn_Open_Window_1
#Btn_Open_Window_2
EndEnumeration
Procedure Open_Window_2(X = 0, Y = 0, Width = 360, Height = 240)
If OpenWindow(#Window_2, X, Y, Width, Height, "Window_2", #PB_Window_SystemMenu)
SetWindowColor(#Window_2, $002000)
ButtonGadget(#Btn_Open_Window_1, 20, 170, 320, 50, "Open Window_1")
EndIf
EndProcedure
Procedure Open_Window_1(X = 0, Y = 0, Width = 360, Height = 240)
If OpenWindow(#Window_1, X, Y, Width, Height, "Window_1", #PB_Window_SystemMenu)
SetWindowColor(#Window_1, $200000)
ButtonGadget(#Btn_Open_Window_2, 20, 170, 320, 50, "Open Window_2")
EndIf
EndProcedure
Define I.i
Open_Window_1(200, 100)
ContainerGadget(#Cont, 20, 20, 320, 140, #PB_Container_BorderLess)
SetWindowLongPtr_(GadgetID(#Cont), #GWL_EXSTYLE, GetWindowLongPtr_(GadgetID(#Cont), #GWL_EXSTYLE) | #WS_EX_CONTROLPARENT)
ListViewGadget(#ListView, 0, 0, GadgetWidth(#Cont), GadgetHeight(#Cont))
SetGadgetColor(#ListView, #PB_Gadget_BackColor, #Cyan) : SetGadgetColor(#ListView, #PB_Gadget_FrontColor, #Blue)
For I=1 To 10
AddGadgetItem(#ListView, -1, "ListView Element " + Str(I))
Next
CloseGadgetList()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #ListView
If EventType() = #PB_EventType_LeftClick
Debug "Window_" + EventWindow() + ", item selected: " + GetGadgetItemText(#ListView, GetGadgetState(#ListView))
EndIf
Case #Btn_Open_Window_1
Open_Window_1(WindowX(#Window_2), WindowY(#Window_2))
SetParent_(GadgetID(#Cont), WindowID(#Window_1))
CloseWindow(#Window_2)
Case #Btn_Open_Window_2
Open_Window_2(WindowX(#Window_1), WindowY(#Window_1))
SetParent_(GadgetID(#Cont), WindowID(#Window_2))
CloseWindow(#Window_1)
EndSelect
EndSelect
ForEver
Re: Transfer a gadget to another window
Hi ChrisR
Your last snippet works fine
But I don't like Openwindow Closewindow (because we can't know the consequences) and I dont't like Hidewindow also it's not hidden from mouse process all the time
Use resize window outside the desktop when you need to hide it it's much better
Your last snippet works fine
But I don't like Openwindow Closewindow (because we can't know the consequences) and I dont't like Hidewindow also it's not hidden from mouse process all the time
Use resize window outside the desktop when you need to hide it it's much better
Egypt my love
Re: Transfer a gadget to another window
Hi RASHAD, thanks for your advices, they're always welcome
For StarWarsFan, Raymond Chen wrote
And when changing the window, save the ListViewGadget in a list to reload it then in the 2nd ListViewGadget for the 2nd window.
For StarWarsFan, Raymond Chen wrote
So, it is perhaps better to have 2 ListViewGadgets one in each window, rather than changing the Parent.Note that changing a window’s parent or owner is not a normal operation.....
.....Since window reparenting is considered to be an unusual condition
And when changing the window, save the ListViewGadget in a list to reload it then in the 2nd ListViewGadget for the 2nd window.