Brainstorming: InApp GUI Modifikation
Brainstorming: InApp GUI Modifikation
Ich war jetzt mal wieder sehr viele Stunden im Auto unterwegs und hab dabei etwas über Funktionen "nice to have" nachgedacht.
Ich würde gerne eine Möglichkeit schaffen, in einer Exe das GUI zu modifizieren,
d.h. die Gadgets anzuordnen, neu zu platzieren. Dies würde einige Probleme im GUI design lösen,
speziell wenn man Gadgets per Code generiert, ist es ein Problem die sauber anzuordnen.
Meine Vorstellung wäre, das "on the fly" hinzubekommen, damit man beim Arbeiten mit dem Programm - wenn was nicht passt,
direkt in den Designmodus wechseln kann. Anpassen, speichern und wieder zurück in den Arbeitsmodus.
Funktionen der GUI inExe Funktionen:
1. Gadgets anordnen (nicht neu generieren), Größe ändern. Diese abspeichern.
2. Verschiedene Designs abspeichern.
3. Das "Weksdesign" wieder herstellen
Was ist zu lösen:
1. Eine Umschaltung zwischen operativen und Designmodus
2. Ein gutes Datenformat das Design zu speichern.
3. Einen GUI Editor, den man einfach in eigen Programme integriern kann.
gesucht:
Code oder Codeansätze das zu lösen.
Ideen!
Ich würde gerne eine Möglichkeit schaffen, in einer Exe das GUI zu modifizieren,
d.h. die Gadgets anzuordnen, neu zu platzieren. Dies würde einige Probleme im GUI design lösen,
speziell wenn man Gadgets per Code generiert, ist es ein Problem die sauber anzuordnen.
Meine Vorstellung wäre, das "on the fly" hinzubekommen, damit man beim Arbeiten mit dem Programm - wenn was nicht passt,
direkt in den Designmodus wechseln kann. Anpassen, speichern und wieder zurück in den Arbeitsmodus.
Funktionen der GUI inExe Funktionen:
1. Gadgets anordnen (nicht neu generieren), Größe ändern. Diese abspeichern.
2. Verschiedene Designs abspeichern.
3. Das "Weksdesign" wieder herstellen
Was ist zu lösen:
1. Eine Umschaltung zwischen operativen und Designmodus
2. Ein gutes Datenformat das Design zu speichern.
3. Einen GUI Editor, den man einfach in eigen Programme integriern kann.
gesucht:
Code oder Codeansätze das zu lösen.
Ideen!
Re: Brainstorming: InApp GUI Modifikation
Vielleicht hilft das als Start.
EnableGadgetTransformation - change gadget at runtime
EnableGadgetTransformation - change gadget at runtime
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
Re: Brainstorming: InApp GUI Modifikation
Wow! Das ist ziemlich genau, das was ich mir ausgemalt habe!
Re: Brainstorming: InApp GUI Modifikation
In der Dialog-Libeary werden die Fenster als XML gespeichert. Das kann beim Starten des Programms auch jedes Mal ausgetauscht werden.
Guten Morgen, das ist ein schöner Tnetennba!
PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
PureBasic 6.21/Windows 11 x64/Ryzen 7900X/32GB RAM/3 TB SSD
Synology DS1821+/DX517, 130.9TB+50.8TB+2TB SSD
Re: Brainstorming: InApp GUI Modifikation
Ich habe mal versucht, sowas von einem XProfan Quellcode zu importieren :
Kommt zwar jetzt noch ein Fehler bei MakeLong. Vielleicht findet ihr ja den Fehler.
Das meiste ist ja API und dürfte ja umsetzbar sein.
So sieht mal das XProfan programm dafür aus :
Die Funktionen mit der Tilde (~) sind die API-Funktionen.
Das wäre jetzt mal rein nur für das Verschieben eines Gadgets + Anzeige der neuen Koordinaten.
Die Koordinaten könnte man ja in eine Preference-Datei speichern. Aber wie bekommt man dann das zugehörige Gadget
dazu ? Die IDs der Gadgets kann man ja nicht nehmen, da die von Windows bei jedem Programmstart neu vergeben werden.
Vielleicht bekommt man was über die Z-Order geregelt ?
Und dann wären ja auch noch die Größen-Änderungen (Animation + Pfeile zum Auseinanderziehen) zu realisieren.
Code: Alles auswählen
Enumeration
#win
#text
#frame
#btn1
EndEnumeration
Structure MyRect
Left.i
Right.i
Top.i
Bottom.i
EndStructure
MyRect.MyRect
Macro MAKELONG(loword, hiword)
(hiword << 16 | loword)
EndMacro
Macro HeiWord(long)
(long >> 16) & $FFFF
EndMacro
Macro LowWord(long)
long & $FFFF
EndMacro
Procedure MoveIt(wnd.i, lParam.l)
GetClientRect_(wnd, MyRect)
MapWindowPoints_(wnd, WindowID(#win), MyRect, 2)
If PtInRect_(MyRect, MakeLong(LowWord(lParam), HeiWord(lParam)))
ReleaseCapture_()
hcursor.l = LoadCursor_(0, #IDC_SIZEALL)
SendMessage_(wnd, #WM_SYSCOMMAND, #SC_MOVE + 1, 0)
hcursor = LoadCursor_(0, #IDC_ARROW)
ProcedureReturn 0
EndIf
ProcedureReturn 1
EndProcedure
If OpenWindow(#win, x, y, 750, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(#text, 10, 10, 120, 25, "verschieb mich")
ButtonGadget(#btn1, 150, 10, 120, 25, "verschieb mich")
FrameGadget(#frame, 10, 100, 300, 200, "verschieb mich")
Repeat
EnumChildWindows_(WindowID(#win), @MoveIt(), MakeLong(WindowMouseX(), WindowMouseY()))
SetWindowTitle(#win, "X1 : " + Str(MyRect\Left) + " Y1 : " + Str(MyRect\Right) + " X2 : " + Str(MyRect\Top) + " Y2 : " + Str(MyRect\Bottom))
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Das meiste ist ja API und dürfte ja umsetzbar sein.
So sieht mal das XProfan programm dafür aus :
Code: Alles auswählen
$H windows.ph
$H messages.ph
STRUCT RECT = Left&,Right&,Top&,Bottom&
Declare appexit%, hd%, text$
WindowTitle "anklicken und verschieben "
Window 800, 600
Var Text& = Create("Text",%hwnd,"veschieb mich",10,10,100,24)
Var Group& = Create("Groupbox",%hwnd,"veschieb mich",10,40,300,300)
Var Button& = Create("Button",%hwnd,"veschieb mich",140,10,100,24)
Var R# = New(RECT)
WhileNot appexit%
WaitInput
~EnumChildWindows(%hwnd,ProcAddr("MoveIt", 2),MakeLong(%mousex,%mousey))
SetText %HWnd, "X1 : " + Str$(R#.Left&) + " Y 1 : " + Str$(R#.Right&) + " X2 " + Str$(R#.Top&) + " Y2 : "+ Str$(R#.Bottom&)
If %key = 2
Dispose hdr#
Dispose R#
appexit%=1
Endif
EndWhile
Proc MoveIt
Parameters wnd&,lParam&
~GetClientRect(wnd&,R#)
~MapWindowPoints(wnd&,%hwnd,R#,2)
If ~PtInRect(R#,LoWord(lParam&),HiWord(lParam&))
~ReleaseCapture()
UseCursor 5
SendMessage(wnd&,~WM_SYSCOMMAND,~SC_MOVE + 1, 0)
UseCursor 0
Return 0
endif
Return 1
EndProc
Das wäre jetzt mal rein nur für das Verschieben eines Gadgets + Anzeige der neuen Koordinaten.
Die Koordinaten könnte man ja in eine Preference-Datei speichern. Aber wie bekommt man dann das zugehörige Gadget
dazu ? Die IDs der Gadgets kann man ja nicht nehmen, da die von Windows bei jedem Programmstart neu vergeben werden.
Vielleicht bekommt man was über die Z-Order geregelt ?
Und dann wären ja auch noch die Größen-Änderungen (Animation + Pfeile zum Auseinanderziehen) zu realisieren.
PB 6.10
Re: Brainstorming: InApp GUI Modifikation
Mal überarbeitet ,)
Code: Alles auswählen
Enumeration
#win
#text
#frame
#btn1
EndEnumeration
Global hCursorSizeAll = LoadCursor_(0, #IDC_SIZEALL)
Global hCursorArrow = LoadCursor_(0, #IDC_ARROW)
Procedure MoveIt(hWnd.i, Window)
Protected Gadget, Rect.Rect, Point.Point, hCurser
GetClientRect_(hWnd, @Rect)
MapWindowPoints_(hWnd, WindowID(Window), @Rect, 2)
Point\x = WindowMouseX(Window)
Point\y = WindowMouseY(Window)
If PtInRect_(@Rect, PeekQ(Point))
Gadget = GetProp_(hWnd, "pb_id")
SetWindowTitle(Window, "Gadget : " + Gadget + " Left : " + Str(Rect\Left) + " Right : " + Str(Rect\Right) + " Top : " + Str(Rect\Top) + " Bottom : " + Str(Rect\Bottom))
SetCursor_(hCursorSizeAll)
ReleaseCapture_()
SendMessage_(hWnd, #WM_SYSCOMMAND, #SC_MOVE + 1, 0)
SetCursor_(hCursorArrow)
GetClientRect_(hWnd, @Rect)
MapWindowPoints_(hWnd, WindowID(Window), @Rect, 2)
SetWindowTitle(Window, "Gadget : " + Gadget + " Left : " + Str(Rect\Left) + " Right : " + Str(Rect\Right) + " Top : " + Str(Rect\Top) + " Bottom : " + Str(Rect\Bottom))
ProcedureReturn 0
Else
;SetWindowTitle(Window, "Gadget : x Left : x Right : x Top : x Bottom : x" )
EndIf
ProcedureReturn 1
EndProcedure
If OpenWindow(#win, x, y, 750, 400, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(#text, 10, 10, 120, 25, "verschieb mich")
ButtonGadget(#btn1, 150, 10, 120, 25, "verschieb mich")
FrameGadget(#frame, 10, 100, 300, 200, "verschieb mich")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Default
If GetAsyncKeyState_(#VK_LBUTTON)
EnumChildWindows_(WindowID(#win), @MoveIt(), #Win)
EndIf
EndSelect
ForEver
EndIf
Zuletzt geändert von mk-soft am 22.12.2024 20:43, insgesamt 4-mal geändert.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Brainstorming: InApp GUI Modifikation

Kleine Update
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Re: Brainstorming: InApp GUI Modifikation
Da habe ich jetzt das gleiche Phänomen wie bei XProfan.
Wenn man ein Gadget verschoben hat, muß man nochmal auf das Gadget draufklicken, um
die richtigen Werte zu erhalten. Eigentlich sollten die Eckpunkte doch schon vorher in der Struktur
gespeichert sein. Die werden doch bei jedem SC_MOVE geupdatet. Ist ja auch der Sinn der übergebenen
Callback - Procedure. Oder sehe oder denke ich das falsch ?
Wenn man ein Gadget verschoben hat, muß man nochmal auf das Gadget draufklicken, um
die richtigen Werte zu erhalten. Eigentlich sollten die Eckpunkte doch schon vorher in der Struktur
gespeichert sein. Die werden doch bei jedem SC_MOVE geupdatet. Ist ja auch der Sinn der übergebenen
Callback - Procedure. Oder sehe oder denke ich das falsch ?
PB 6.10
Re: Brainstorming: InApp GUI Modifikation
Nach dem Moving mal das Rect noch mal abfragen, da ich nur bei Mouse down diese aufrufe.
Habe ich oben angepasst ...
Cursor geht noch nicht
Habe ich oben angepasst ...
Cursor geht noch nicht

Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive