Parent(s) von modalen Fenster mitverschieben

Grafische Primitive, XbaseParts und Darstellungsfragen allgemein.

Moderator: Moderatoren

Antworten
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Parent(s) von modalen Fenster mitverschieben

Beitrag von Markus Walter »

Hi,

kennt jemand eine einfache Methode, um alle Parents (könnten geschachtelt mehrere sein) eines modalen Fensters mit zu verschieben, wenn das modale Fenster selbst verschoben wird?

Bei meiner Anwendung sind alle Dialoge (XbpDialog und XbpCrt) modale Fenster. Wenn nun ein solches geöffnet ist und der Anwender es "zur Seite" schieben will, kann er nur das modale Fenster verschieben, dann ist dessen Parent noch immer im Weg...

Gibt es da eine einfache Lösung?
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Markus,
da wird es keine geben!
Wenn Du ein modales Fenster nimmst, sorgt das ja dafür, dass keinerlei Nachrichten an die anderen Fenster gelangen (Modalität).
Du könntest höchstens probieren, die Modalität selber abzubilden, indem Du Dein Fenster halt immer im Vordergrund hast und bei einem Klick in ein im Hintergrund liegendem Fenster wieder per SetAppFocus() das vordere Fenster anwählst (so in der Art). Dann könntest Du auch die im Hintergrund liegenden Fenster ansprechen (Größe und Position ändern...)

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Dialog Fenster

Beitrag von Rolf Ramacher »

Hi Markus,


ich habe meine Fenster nicht im Modal-Modus. Wenn du dies mit xbpdialog
machst und mit SetAppFocus immer den aktuellen Fenster-Dialog setzt
muß es gehen.

Ich habe dies allerdings ausgeschaltet, indem ich das Parent-Fenster
enable:(). Dies muß ich tun wegen bestimmter Programmabläufe.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hi Markus,

nimm doch den :move()-Callback des modalen Dialogs.
Wenn der aufgerufen wird, weißt du die alte und die neue Position.
Parent bzw. Owner können dann per :setPos() um die gleiche Positionsdifferenz verschoben werden.

Viele Grüße,
Günter
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Günter,
Günter Beyes hat geschrieben:Parent bzw. Owner können dann per :setPos() um die gleiche Positionsdifferenz verschoben werden.
wie soll das gehen? Wenn das modale Fenster aktiv ist, kommt man doch an die anderen Objekte gar nicht ran, oder? Die Events werden doch geblockt.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Parent(s) von modalen Fenster mitverschieben

Beitrag von AUGE_OHR »

hi,
Markus Walter hat geschrieben: kennt jemand eine einfache Methode, um alle Parents (könnten geschachtelt mehrere sein) eines modalen Fensters mit zu verschieben, wenn das modale Fenster selbst verschoben wird?
Wenn du ein "Child" Fenster verschiebst bekommt der Parent davon nichts
mit. Wenn du aber den Parent verschiebst und die "Child" Fenster ein
oSubWin:moveWithOwner := .T. (angedockt) hat so verschiebt du die mit
wenn der Parent verschoben wird.

Ansonsten kann du im "Child" Fenster mal probieren den Owner = Parent
zu setzten ob dir das hilft.

gruss by OHR
Jimmy



gruss by OHR
Jimmy
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hallo Günter,

der von Dir beschriebene Weg funktioniert soweit...

... bis ich die linke Maustaste loslasse!!!


Ich habe den move-Slot benutzt...

Code: Alles auswählen

  oDlg:move := {| aOldPos, aNewPos, o | wGuiDCReadMove(o, aOldPos, aNewPos) }
die zugewissene Funktion sieht so aus:

Code: Alles auswählen

STATIC FUNCTION wGuiDCReadMove(o, aOldPos, aNewPos)
local oParent, aPosParent
local nDiffX, nDiffY

  nDiffX := aOldPos[1] - aNewPos[1]
  nDiffY := aOldPos[2] - aNewPos[2]

  if !empty(nDiffX) .or. !empty(nDiffY)


    oParent := o:setparent()
    if oParent == AppDesktop()
      oParent := o:setowner()
    endif

    aPosParent := oParent:currentPos()
    aPosParent := {aPosParent[1]-nDiffX, aPosParent[2]-nDiffY}
    oParent:setPos(aPosParent)

ddbg(var2char(oParent) + str(aPosParent[1]) + str(aPosParent[2]))
    

  endif

RETURN NIL
Anmerkung: Das ich den Owner statt dem Parent benutze, liegt daran, das bei meinen modalen Fenstern der AppDesktop() Parent ist...

Das Ganze funktioniert, solange ich das Child-Fenster verschiebe (linke Maustaste gedrückt). Sobald ich diese loslasse, schieben sich beide Fenster (Hauptfenster und Child) nach rechts aus dem Anzeigebereich raus. Ich habe mir die Koordinaten in eine Debug-Datei ausgeben lassen. Die Funktion wird permanent weiter aufgerufen und der X-Wert erhöht sich immer weiter...

Ich verstehe aber nicht warum. Ich dachte schon an eine Rekursion (nämlich das durch das setpos(...) ja wieder :move() ausgelöst wird, aber bei meinem Hauptfenster habe ich den move-Block nicht gesetzt...

Was könnte das sein?
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Markus Walter hat geschrieben:

Code: Alles auswählen

  oDlg:move := {| aOldPos, aNewPos, o | wGuiDCReadMove(o, aOldPos, aNewPos) }
Anmerkung: Das ich den Owner statt dem Parent benutze, liegt daran, das bei meinen modalen Fenstern der AppDesktop() Parent ist...
zuerst zur Anmerkung : wenn dein Parent AppDeskTop() ist und der
Owner das "vorherige" XbpDialog (oder oCrt) dann verstehe ich dein
Problem nicht. Es funktioniert doch so mit "verschieben" !?

Gerade mit der Kombination arbeitet doch :moveWithOwner := .T.
wenn du es in den "Child" Dialog setzt.

zum oDlg:move erstmal die Frage ob das "der vorherige" XbpDialog ist
der als Owner für dein modales Fenster fungiert ?
Wenn Ja s.h. Anmerkung, wenn Nein und es ein "tieferer" (geschachtelt)
Parent ("Main") ist : versuche es mal mit dem :resize Block im "Main"
XbpDialog und mache auf die "Child" ein :SetPost()

Da ich :move nicht verwende, kann ich mich nur an :resize orientieren.
Hierbei muss jedes Fenster, das "size"bar sein soll, einen eigenen :resize
Block haben.

Wie beim :resize sollte man :move wohl nur im "Main" XbpDialog "anstossen"
und die Child´s "sollten" dann "merken" (OldSize,NewSize bzw Position)
ob ein :resize (:move) erforderlich ist.

gruss by OHR
Jimmy
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Markus,

du hast völlig Recht. :shock:

Aber so geht's, frag im Moment bitte nicht, wieso SetAppWindow():setPos() den modalen Dialog mit sich zieht :?
Wohl ein implizites :MoveWithOwner :o

Code: Alles auswählen

PROCEDURE MoveParent(old,new,o)

LOCAL dX := new[1]-old[1]
LOCAL dY := new[2]-old[2]
LOCAL aParentPos

IF dX <> 0 .or. dY <> 0
   aParentPos := SetAppWindow():currentPos()
   aParentPos[1] += dX
   aParentPos[2] += dY
   SetAppWindow():setPos( aParentPos )
   o:setPos(new)   // DAS BRINGT'S
ENDIF

RETURN
Eben getestet mit Modality.prg der Alaska-Samples ( SOURCE\samples\basics\WINDOWS\Modality.prg ),
Funktion Modaldialog().
MoveParent() steht im :move-Callbackslot des modalen Dialogfensters.

@Martin:

Heißt Modalität nicht lediglich, daß Tastatur- und Mausevents für den Owner blockiert werden? Alles andere läuft weiter. Beispiel Paint: Wenn du einen modalen Dialog über seinem Owner verschiebst, wird der zuvor verdeckte Bereich des Owners neu gezeichnet (wenn man nicht wie hier am Mechanismus herumschraubt :) )

Viele Grüße,
Günter
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Günter,
Günter Beyes hat geschrieben: Heißt Modalität nicht lediglich, daß Tastatur- und Mausevents für den Owner blockiert werden? Alles andere läuft weiter. Beispiel Paint: Wenn du einen modalen Dialog über seinem Owner verschiebst, wird der zuvor verdeckte Bereich des Owners neu gezeichnet (wenn man nicht wie hier am Mechanismus herumschraubt :) )
Du hast recht und ich mal wieder was dazugelernt :!:
Ich hatte das andersrum betrachtet, da ja nur die Bereiche des überlagerten Fensters neugezeichnet werden, die durch das Verschieben des modalen Fensters wieder sichtbar werden.
Aber dazu muß natürlich das nicht-modale Fenster auf entsprechende Events reagieren... ](*,) :roll:
Naja - jetzt bin ich die nächsten Tage erst mal wieder etwas zurückhaltender mit definitiven Aussagen :wink:

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Markus,
Markus Walter hat geschrieben: Das Ganze funktioniert, solange ich das Child-Fenster verschiebe (linke Maustaste gedrückt). Sobald ich diese loslasse, schieben sich beide Fenster (Hauptfenster und Child) aus dem Anzeigebereich raus.

Ich verstehe aber nicht warum. Ich dachte schon an eine Rekursion (nämlich das durch das setpos(...) ja wieder :move() ausgelöst wird, aber bei meinem Hauptfenster habe ich den move-Block nicht gesetzt...

Was könnte das sein?
Tatsächlich :moveWithOwner. Die Vorbelegung ist TRUE; das hatte ich in dem Moment nicht bedacht. :oops: Und schon nimmt das Pingpongspiel seinen Lauf...

Viele Grüße,
Günter
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hallo Günter,

tausend Dank. Es funktioniert jetzt wie gewünscht... :D

FAST :(

Ich verwende auch noch jede Menge XbpCrts. Da bleiben 1 (oder 2) Probleme:
Das Move-Ereignis ist/arbeitet anders als beim XbpWindow: es liefert die alte Position nicht (warum auch immer).
Da Ereignis wird offenbar auch beim Erzeugen des Crt einmal erzeugt, was beim XbpWindow auch nicht so ist.
Im Übrigen gibt es auch die Eigenschaft :MoveWithOwner bei XbpCrts nicht.

Schade, denn ich verwende noch jede Menge dieser Crts.
Ich habe mal eine Mail an Alaska geschickt...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Markus,
Das Move-Ereignis ist/arbeitet anders als beim XbpWindow: es liefert die alte Position nicht (warum auch immer).
Das Ereignis wird offenbar auch beim Erzeugen des Crt einmal erzeugt, was beim XbpWindow auch nicht so ist.
Im Übrigen gibt es auch die Eigenschaft :MoveWithOwner bei XbpCrts nicht.
Ist es wichtig, daß man den Owner nach dem Verschieben zumindest teilweise noch auf dem Bildschirm sehen kann? Falls nein, gäbe es noch eine Möglichkeit, die bei XbpCrt und XbpDialog gleichermaßen funktionieren dürfte.

Du könntest auf jedem modalen Dialog eine Schaltfläche vorsehen, welche den/die Owner ganz aus dem sichtbaren Bildschirmbereich hinausschiebt bzw. sie wieder herstellt.

Im Prinzip ungefähr so:

Code: Alles auswählen

oBtn:activate := {||iif(oDlg:Cargo=NIL,HideOwner(oDlg),ShowOwner(oDlg))}

PROCEDURE HideOwner( oDlg ) 

// aktuelle Position des modalen Dialogs merken
LOCAL aDlgPos := oDlg:currentPos()
LOCAL oOwner := oDlg:setOwner()

IF oDlg:Cargo == NIL
  // aktuelle Position des Owners merken
  oDlg:Cargo := oOwner:currentPos()
  
  // Owner beiseite schieben
  oOwner:setPos({2000,2000})

  // modaler Dialog ist mitgewandert;
  // Position wieder herstellen
  oDlg:setPos( aDlgPos )
ENDIF

RETURN

PROCEDURE ShowOwner( oDlg ) 

LOCAL aDlgPos := oDlg:currentPos()
LOCAL oOwner := oDlg:setOwner()

IF oDlg:Cargo != NIL
   // Owner-Position wieder herstellen
   oOwner:setPos( oDlg:Cargo )
   oDlg:Cargo := NIL

   oDlg:setPos( aDlgPos )
ENDIF

RETURN

Viele Grüße,
Günter
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,

Frage :

warum eigendlich ":move" und nicht "minimize" ?

was passiert wenn du den Parent deines modalen Fenster´s "minimize"d ?

gruss by OHR
Jimmy
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hi Günter, hi Jimmy,

es geht mir wirklich um Verschieben, nicht um minimieren oder ganz ausblenden.

Ich möchte das so lösen, dass "normales" Verschieben mit der Maus nur das oberste (modale) Fenster verschiebt (damit der Anwender das dahinter liegende Fenster meiner Anwendung sehen kann).
Dann möchte ich, wenn beim Verschieben Strg gedrückt ist, meine ganze Anwendung verschieben können.

Aber da :move() bei XbpCrts anders arbeitet, wie bei XbpWindow sehe ich da wenig Möglichkeit. Wenn nur XbpWindows geöffnet sind (außer meinem Hauptfenster) klappt es ja schon wie gewünscht...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
(damit der Anwender das dahinter liegende Fenster meiner Anwendung sehen kann).
noch eine Idee (noch nicht probiert) : wie wäre es denn wenn du das
Fenster "transparent" machst ala VISTA (s.h. Wissensbasis) ?

gruss by OHR
Jimmy
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hi Jimmy,

nee, lass mal, ich will schon verschieben...

Auf das Wort "Vista" reagiere ich übrigens im Moment allergisch. Wegen Änderungen die ich wegen Vista an meiner Software machen muss, aber auch wegen Vista selbst...
Aber da müssen wir mal einen eigenen Thread auf machen.

Was das Verschieben-Problem angeht, bin ich mit Alaska in Kontakt. Mal sehen.

Aus der Hilfe von XbpCrt:
move := {| aNewPos, uNIL, self | ... }

Aus der Hilfe von XbpWindow:
:move := {| aOldPos, aNewPos, self | ... }

Das bei beiden Codeblöcken die Parameter-Übergabe nicht gleich ist, kann ich nun wirklich nicht nachvollziehen...
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Markus,
Markus Walter hat geschrieben: Was das Verschieben-Problem angeht, bin ich mit Alaska in Kontakt. Mal sehen.

Aus der Hilfe von XbpCrt:
move := {| aNewPos, uNIL, self | ... }

Aus der Hilfe von XbpWindow:
:move := {| aOldPos, aNewPos, self | ... }

Dass bei beiden Codeblöcken die Parameter-Übergabe nicht gleich ist, kann ich nun wirklich nicht nachvollziehen...
Welche Xpp-Version verwendest du? Für 1.9 habe ich etwas in der Schublade, womit XbpCrt überredet werden kann, dem :move-Codeblock die alte und die neue Position zu übergeben.

Viele Grüße,
Günter
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hallo Günter,

ich verwende 1.9.

Was hast Du denn für tolle Schubladen...? :D :D :D
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Hallo Markus,

in der Schublade (nee, seit 1.9 als DLL in der Werkzeugkiste) liegen C-Funktionen, die das Subclassing von Xbase++ - Fenstern und Controls ( im Sinne der "klassischen" Windows-API-Programmierung) mittels einer Xbase++ - Funktion ermöglichen.

In einer Alaska-Newsgroup habe ich mal den C-Sourcecode und das resultierende .obj gepostet, womit das geht.

XbpCrt:move() könnte man damit zum Beispiel so auf die Sprünge helfen.

Code: Alles auswählen

STATIC FUNCTION CrtWindowProc( hwnd, msg, wparam, lparam, oDlg )

STATIC aOldPos 

#define WM_ENTERSIZEMOVE   0x0231
#define WM_EXITSIZEMOVE    0x0232

IF     msg = WM_ENTERSIZEMOVE
    aOldPos    := oDlg:currentPos()
ELSEIF msg = WM_EXITSIZEMOVE
    PostAppEvent( xbeP_Move, aOldPos, oDlg:currentPos(), oDlg )
    aOldPos := NIL
ENDIF

// die ursprüngliche window procedure aufrufen
RETURN _CallPrevWindowProc( hwnd, msg, wparam, lparam )
Laß mir doch über PM deine E-Mail-Adresse zukommen, dann könnte ich dir das Teil auch zuschicken.

Viele Grüße,
Günter
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hallo Günter,

habe soeben eine pn geschickt... :)
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Antworten