Position von Child-Windows in einem MDI-Gadget ermitteln

Für allgemeine Fragen zur Programmierung mit PureBasic.
Sven
Beiträge: 374
Registriert: 23.09.2004 12:01

Position von Child-Windows in einem MDI-Gadget ermitteln

Beitrag von Sven »

Hallo! Wie kann ich die X-Y-Position von Child-Windows in einem MDI-Gadget ermitteln und setzen? Ich will damit die Fensterpositionen als benutzerspezifische Einstellung abspeichern und laden.

- GetGadgetItemAttribute(#gIDchild, #cIDpanel, #PB_MDI_ItemWidth) funktioniert nur für Breite und Höhe, nicht für Position
- GadgetX(#gIDchild) und GadgetY(#gIDchild) geben die Position des Gadgets aus, nicht der enthaltenen Fenster
- WindowX() und WindowY() geben die Position des aktuellen Fensters aus, aber wie kann ich ein Child-Window aktuell setzen, ich habe ja keine Window-ID dafür, allenfalls den Handle, und der nützt mir bei UseWindow() nix.
- API, aber welche Befehle?

Fazit: Ich komm hier nicht weiter, und im CodeArchiv ist MDI eher kaum vertreten. :( Wer weiss was?

Sven
Mereep
Beiträge: 72
Registriert: 01.09.2004 18:55
Wohnort: Annaberg-Buchholz

Beitrag von Mereep »

Kannst mal mit FindWindow_()
Und dann GetWindowPlacement_() versuchen...
keine Ahnung ob du damit Erfolg hast ;-)
Print("Hallo Welt")
Thomas Kühn
Beiträge: 15
Registriert: 06.01.2005 12:58
Wohnort: Stuttgart

Beitrag von Thomas Kühn »

Hi Sven,

hast Du schon eine Loesung fuer Dein Problem?
Ich suche auch eine Moeglichkeit und habe heute etwas experimentiert.

Hier mein Code. Ich nutze GetWindowRect() und muss aber das MDI Fenster verschieben, um so die relativen Koordinaten herauszubekommen.

Gruss
Thomas

Code: Alles auswählen

Procedure.l ChildWindowX(hWndMain.l, hWndChild.l)

   ChildX.l
   ChildY.l

   GetWindowRect_(hWndMain, @Main.RECT)                              ;Position in Screen-Koordinaten
   GetWindowRect_(hWndChild, @Child.RECT)                            ;Position in Screen-Koordinaten
   
   ChildX = Child\left - Main\left                                   ;linke Kante (relativ)
   ChildY = Child\top - Main\top                                     ;obere Kante (relativ)
   
   SetWindowPos_(hWndChild, 0, 0, 0, -1, -1, #SWP_NOSIZE | #SWP_NOZORDER)    ;hWndChild auf Koordinaten 0,0 setzen   
   GetWindowRect_(hWndChild, @Child.RECT)                            ;Position in Screen-Koordinaten (jetzt bei 0,0)       
   
   ChildX = ChildX - (Child\left - Main\left)                        ;Offset berechnen (wegen Menu, ToolBar...)
   ChildY = ChildY - (Child\top - Main\top)                          ;Offset berechnen (wegen Menu, ToolBar...)
   
   SetWindowPos_(hWndChild, 0, ChildX, ChildY, -1, -1, #SWP_NOSIZE | #SWP_NOZORDER)   ;hWndChild wieder auf alte Koordinaten setzen (relativ zu hWndMain)
                
   ProcedureReturn ChildX
   
EndProcedure

;* * * * * * * * * *
;* * * * * * * * * *

Procedure.l ChildWindowY(hWndMain.l, hWndChild.l)

   ChildX.l
   ChildY.l

   GetWindowRect_(hWndMain, @Main.RECT)                              ;Position in Screen-Koordinaten
   GetWindowRect_(hWndChild, @Child.RECT)                            ;Position in Screen-Koordinaten
   
   ChildX = Child\left - Main\left                                   ;linke Kante (relativ)
   ChildY = Child\top - Main\top                                     ;obere Kante (relativ)
   
   SetWindowPos_(hWndChild, 0, 0, 0, -1, -1, #SWP_NOSIZE | #SWP_NOZORDER)    ;hWndChild auf Koordinaten 0,0 setzen   
   GetWindowRect_(hWndChild, @Child.RECT)                            ;Position in Screen-Koordinaten (jetzt bei 0,0)       
   
   ChildX = ChildX - (Child\left - Main\left)                        ;Offset berechnen (wegen Menu, ToolBar...)
   ChildY = ChildY - (Child\top - Main\top)                          ;Offset berechnen (wegen Menu, ToolBar...)
   
   SetWindowPos_(hWndChild, 0, ChildX, ChildY, -1, -1, #SWP_NOSIZE | #SWP_NOZORDER)   ;hWndChild wieder auf alte Koordinaten setzen (relativ zu hWndMain)
                
   ProcedureReturn ChildY
   
EndProcedure

;* * * * * * * * * *
;* * * * * * * * * *

;zum Testen
;
If OpenWindow(0, 0, 0, 400, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MaximizeGadget,"MDIGadget")
   If CreateGadgetList(WindowID(0)) And CreateMenu(0, WindowID(0))
      MenuTitle("Menu index 0")
      MenuTitle("MDI windows menu")
      MenuItem(0, "self created item")
      MenuItem(1, "self created item")
      MDIGadget(0, 0, 0, 0, 0, 1, 2, #PB_MDI_AutoSize)
    
      mdiChild1 = AddGadgetItem(0, -1, "child window 1")
      mdiChild2 = AddGadgetItem(0, -1, "child window 2")           
    
      SetWindowPos_(mdiChild1, 0, 25, 10, -1, -1, #SWP_NOSIZE)
      SetWindowPos_(mdiChild2, 0, 50, 10, 100, 100, #SWP_NOZORDER)       
 
      Debug ChildWindowX(WindowID(0), mdiChild1)   
      Debug ChildWindowY(WindowID(0), mdiChild1)  
  
   EndIf
   
   Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow

EndIf
Edit by Kiffi: Code-Tags gesetzt
Antworten