Brainstorming: InApp GUI Modifikation

Für allgemeine Fragen zur Programmierung mit PureBasic.
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Brainstorming: InApp GUI Modifikation

Beitrag von SMaag »

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!
Axolotl
Beiträge: 265
Registriert: 31.12.2008 16:34

Re: Brainstorming: InApp GUI Modifikation

Beitrag von Axolotl »

Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
SMaag
Beiträge: 184
Registriert: 08.05.2022 12:58

Re: Brainstorming: InApp GUI Modifikation

Beitrag von SMaag »

Wow! Das ist ziemlich genau, das was ich mir ausgemalt habe!
Benutzeravatar
jacdelad
Beiträge: 404
Registriert: 03.02.2021 13:39
Wohnort: Riesa
Kontaktdaten:

Re: Brainstorming: InApp GUI Modifikation

Beitrag von jacdelad »

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
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Brainstorming: InApp GUI Modifikation

Beitrag von H.Brill »

Ich habe mal versucht, sowas von einem XProfan Quellcode zu importieren :

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
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 :

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
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.
PB 6.10
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Brainstorming: InApp GUI Modifikation

Beitrag von mk-soft »

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
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Brainstorming: InApp GUI Modifikation

Beitrag von H.Brill »

Klasse, mk-soft !

Wäre ja schon mal ein Anfang.
PB 6.10
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Brainstorming: InApp GUI Modifikation

Beitrag von mk-soft »

;)

Kleine Update
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Brainstorming: InApp GUI Modifikation

Beitrag von H.Brill »

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 ?
PB 6.10
Benutzeravatar
mk-soft
Beiträge: 3844
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Brainstorming: InApp GUI Modifikation

Beitrag von mk-soft »

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 :(
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten