• Bin gerade am Testen mit der WinResize()-Variante. Wenn ich diesen Weg gehen würde, dann müsste ich die folgenden Hints und Attribute vom GenPrimary zur Laufzeit ändern können:

    ATTR_GEN_DISPLAY_NOT_MAXIMIZABLE
    HINT_DISPLAY_NOT_RESIZABLE
    HINT_PRIMARY_NO_EXPRESS_MENU

    Ich bin der Meinung, dass das gehen sollte, aber nicht für alles geht. Hat mir jemand einen Hint, über welche Funktion oder Message ich das angehen soll?

  • Hallo Andreas,
    beim Arbeiten mit Windows und Windowhandles bin ich erst mal raus. So etwas habe ich noch noch nie gemacht, außer in der oben beschriebenen Form.

    Folgendes ist daher keine Empfehlung sondern der Versuch eines Weges, das Problem mit dem vorhandenen Wissen zu lösen.
    Ich würde weiter in die Richtung mit nur einem VisContent denken. Statt mehrerer VisContens hast du dann mehrere VisTrees.

    Je nach Bedarf koppelst du VisA, VisB oder VisC an dein VisContent. Dann kannst du das FullScreenWindow auf VisContent-Ebene lassen. Die Objekte VisA, VisB und VisC müssen vom Typ VisComp sein (die können Children haben). Soweit ich mich erinnere leiten sie die Vis_DRAW einfach an ihre Children weiter, so dass du sie wahrscheinlich nicht mal überschreiben musst.

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Hallo Rainer

    Das mit einem Zwischen-Objekt ging mir auch einmal durch den Kopf. Habe es aber bis jetzt noch nicht versucht. Ich müsste dann jeweils am VisContent das aktuelle VisComp entfernen und dann das neue VisComp hinzufügen. Das sollte sicher machbar sein. Komme eventuell darauf zurück, wenn mir die aktuellen Wege ausgehen. Alles hat irgendwo Vor- und Nachteile. Ich bin immer noch am abwiegeln...

    Aktuell bin ich an einer Kombination mit WinResize() und Maximieren dran. Ursprünglich hatte ich das Maximieren deaktiviert. Ich war der Meinung, das Fenster soll immer so gross sein wie sein Inhalt. Doch im maximierten Zustand kann ich mit wenig Aufwand das bestehende Window der View auf den gesamten Bildschirm erweitern. Ganz ohne ein zusätzliches Window zu erstellen. Beim De-Maximieren wird das Window der View wieder auf die ursprüngliche Grösse zurückgestellt. Dann sieht das Fenster wieder komplett gleich aus. Mal schauen, wie weit ich komme.

    Wünsche nun eine gute Nacht. Ich bleibe dran!

  • Hallo zusammen

    Habe gerade eine sehr intensive Woche mit privaten Themen hinter mir. Trotzdem hier einmal einen Zwischenstand meiner Odysee...

    Der Ansatz über ein zusätzliches Window per WinOpen() wie es GeoPoint macht, wäre wohl der "echte" Fullscreen. Hier wird wirklich der ganze Bildschirm gecovert, inklusive allfälliger Taskbar. Bei diesem muss man sich auch nicht manuell um das Express Menu und andere Gadgets kümmern. Wenn man aber den gleichen Inhalt im Festermodus und Vollbild braucht, wird es kompliziert, jeweils das entsprechende Window-Handle umzubiegen.

    Mein nächster Versuch war, das bestehende Window mit WinResize() zu vergrössern. Das funktioniert, aber gezeichnet wird nur innerhalb vom GenPrimary. Wenn man das GenPrimary maximiert, ist man schon sehr nahe an einem "pseudo" Fullscreen. Nur muss man dann die Fenster-Elemente von Hand entfernen und wieder hinzufügen.

    Weitere Versuche waren noch mit zwei GenPrimary's. Diesen Weg habe ich dann aber schnell wieder verlassen.

    Den Ansatz mit dem Maximieren verwendet meiner Meinung nach auch GeoSafari. Es wird da auch einiges von den UI-Gadgetry angepasst. Im Code ist dazu aber sehr viel auskommentiert...

    So, nun zu meinem aktuellen Stand. Ich setze aktuell auf das Maximieren des GenPrimary ohne WinResize(). Das bedeutet, dass die Taskbar nicht überdeckt wird. Aber unter Motif füllt das GenPrimary den ganzen Bildschirm. Ohne WinResize() muss ich mich auch nicht speziell um die Platzierung des GenView's kümmern und auch der Nullpunkt für das Zeichnen ändert sich nicht. Das Entfernen von Express Menu, Hilfe Knopf und des Fensterrahmens geht über die Attribute, wenn man den Weg dazu herausgefunden hat. Ich verwende folgenden Code dazu:

    Zwischenfrage: Wäre es besser mit den VarDataXxx() Funktionen zu arbeiten?

    Das sieht dann folgendermassen aus:

    Soweit liess sich das Ganze relativ gut implementieren.

    Offen sind noch folgende Punkte:

    • Die Hintergrund-Farbe vom GenPrimary ändern
    • Den verbliebenen äussersten Rahmen zu entfernen
    • Den Mauszeiger verstecken

    Für diese Punkte habe ich bis jetzt keine funktionierenden Wege gefunden und wäre für jede Idee dankbar.

    Andreas

  • Wäre es besser mit den VarDataXxx() Funktionen zu arbeiten?

    Ich glaube VarDataxx() ist etwas schneller. Das dürfte bei dir keine messbaren Vorteile bringen. Ich nutze sie aber lieber.

    Die Hintergrund-Farbe vom GenPrimary ändern
    Den verbliebenen äussersten Rahmen zu entfernen
    Den Mauszeiger verstecken

    1. Keine Ahnung. Du hast ja auch noch ein View, dass einen Hintergrund macht, oder? Da würde ich ansetzen.
    2. Gar keine Ahnung.
    3. Hatten wir das nicht schon? Transparenter Mauszeiger?

    Gruß
    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Ich glaube VarDataxx() ist etwas schneller. Das dürfte bei dir keine messbaren Vorteile bringen. Ich nutze sie aber lieber.

    1. Keine Ahnung. Du hast ja auch noch ein View, dass einen Hintergrund macht, oder? Da würde ich ansetzen.
    2. Gar keine Ahnung.
    3. Hatten wir das nicht schon? Transparenter Mauszeiger?

    Gruß
    Rainer

    Zu 1.: Die GenView ist mittig im GenPrimary und nicht auf das Vollbild skaliert, siehe Cyan farbiger Bereich im Screenshot

    Zu 3.: Wir hatten das bei der GenView. Da verwende ich die Methode MSG_GEN_VIEW_SET_PTR_IMAGE() welche auch tadellos funktioniert. Es geht mir darum, im Maximized-Modus den Mauszeiger auch asserhalb der View zu verstecken. Hier wäre wohl die Methode MSG_GEN_SYSTEM_SET_PTR_IMAGE() zu verwenden.

  • Bezüglich Mauszeiger wollte ich diesen zuerst nur für die Geode ausblenden. Leider bekomme ich das mit WinGeodeSetPtrImage(GeodeGetProcessHandle(), @FullPointer); nicht hin. Systemweit geht es mit:

    Code
    MemLock(OptrToHandle(@FullPointer));
    evt = @record GenClass::MSG_GEN_SYSTEM_SET_PTR_IMAGE(@FullPointer, PIL_SYSTEM);
    @call oself::MSG_GEN_CALL_SYSTEM(evt);
    MemUnlock(OptrToHandle(@FullPointer));

    Die Konstante PIL_GEODE soll man ja laut Doku nicht verwenden (ging auch nicht).

    Eventuell verstehe ich hier "GEODE" falsch...

    Weiter durfte ich noch lernen, dass man in der Close-Methode der Anwendung nicht mehr den Maximized-Zustand vom Primary ermitteln kann. Scheint zu spät dafür zu sein. Aber einfach "unconditionally" die Nachricht MSG_GEN_DISPLAY_SET_NOT_MAXIMIZED ans GenPrimary zu senden funktioniert. Da setze ich den System-Mauszeiger jeweils wieder zurück. Ansonsten hat man nach dem Beenden der Anwendung im Maximized-Zustand plötzlich den falschen (bei mir unsichtbaren) Mauszeiger...

  • Hallo Andreas,

    Die GenView ist mittig im GenPrimary und nicht auf das Vollbild skaliert, siehe Cyan farbiger Bereich im Screenshot

    Ok, dann bin ich von falschen Voraussetzungen ausgegangen. Wozu brauchst du dann das Vollbild, wenn du ein kleineres View hast?

    Der Code sieht ansonsten ok aus - das MemLock/MemUnlock ist wieder überflüssig. Übergibst du einen optr muss der Chunk grundsätzlich nicht gelockt sein, das macht der Empfänger der Message / die Routine immer selbst. Versuchen (try and error) würde ich im @record GenClass zu ersetzen durch NullClass oder GenSystemClass. Oder dem Primary die Message selber senden (ohne @record) - in der Hoffnung dass PIL_SYSTEM dafür sorgt dass es systemweilt gilt. Oder doch PIL_GEODE versuchen?

    Mit den PIL_xx hatte ich in R-BASIC auch schon Problem, das ging es aber um das automatische Zurücksetzen des Pointers, wenn ich den Bereich verlasse. manchmal ist in R-BASIC der Pointer auch noch falsch.

    Ganz böse Idee:

    Code
    @message void MSG_VIS_VUP_SET_MOUSE_INTERACTION_BOUNDS(@stack int bottom, int right, int top, int left);

    Und den Interactionsbereich auf ganz unten rechts einschränken. Dann siehst du evtl nur noch die Spitze des Mauszeigers :)

    So, genug der unausgegorenen Ideen.

    LG
    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Danke Rainer, Deine Inputs sind immer sehr wertvoll für mich!

    Das View wird noch grösser werden, hoffentlich ;) Das ist die letzte Herausforderung in meinem Katalog... Es spielt sich auch angenehmer, wenn keine ablenkenden GUI-Elemente zu sehen sind. Und darum möchte ich den ganzen Hintergrund des GenPrimary auch in die Farbe des GenView.

    Ohne den MemLock hat es bei mir zum Teil den Mauszeiger nicht ersetzt. Mit dem Memlock funktioniert es zuverlässig. Weiss nicht, ob das mit dem @record und dem Senden der Message darüber zusammenhängt.

    Den Mausbereich einzuschränken ist sehr böse ^^ Muss sich noch ein bisschen setzen...

  • Ohne den MemLock hat es bei mir zum Teil den Mauszeiger nicht ersetzt. Mit dem Memlock funktioniert es zuverlässig. Weiss nicht, ob das mit dem @record und dem Senden der Message darüber zusammenhängt.

    Sorry, du hast recht, den Memlock wirst du für das @record brauchen. Wer genau hinsieht ist hat im Vorteil - obwohl, auch hier wird nur der optr aufgezeichnet, also eigentlich nicht. Möglicherweise macht MSG_GEN_SYSTEM_SET_PTR_IMAGE das Memlock/unlock doch nicht?

    Wenn das View den ganzen Bildschirm einnimmt kannst du ja davon die Hintergrundfarbe ersetzen. Das geht ohne Probleme.

    Ansonsten habe ich mich daran erinnert, dass ich in R-BASIC z.B. im Canvas Objekt (Generic) VIS_DRAW überscheibe ohne @callsuper (geht, wenn man keinje Children hat) und dort einfach GrFillRect() auf die Bounds ausführe, um den Hintergrund zu füllen.

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Ansonsten habe ich mich daran erinnert, dass ich in R-BASIC z.B. im Canvas Objekt (Generic) VIS_DRAW überscheibe ohne @callsuper (geht, wenn man keinje Children hat) und dort einfach GrFillRect() auf die Bounds ausführe, um den Hintergrund zu füllen.

    Hallo Rainer

    Auf die MSG_VIS_DRAW vom GenPrimary wäre ich jetzt nicht wirklich von alleine gekommen. Super Idee und es funktioniert! Einzig konnte ich noch nicht ermitteln, wo das GenPrimary seine Bounds speichert. Es scheint keine VI_bounds zu haben und beim Abgrasen der Doku habe ich auch nichts verwertbares gefunden . In meinem Fall nehme ich jetzt einfach die Bildschirmauflösung und muss in der Breite und Höhe noch jeweils 2 Pixel dazu geben. Aber dann ist es perfekt ;)

    Andreas

  • Einzig konnte ich noch nicht ermitteln, wo das GenPrimary seine Bounds speichert.

    MSG_VIS_GET_BOUNDS sollte gehen. GenClass ist eine SubClass der VisClass. Alle VIS- und META-Messages gehen auch für Gen-Objekte.

    Es scheint keine VI_bounds zu haben

    Eigentlich doch. Jedes sichtbare Objekt hat VI_bounds.

    Der übergebene optr gehört zur BasicImageClass, die wiederum ein GenInteraction ist. Der Code oben spart die GET_BOUND-Mesage - wegen der Performance :)

    Code
    @class BasicImageClass, GenInteractionClass;

    Rainer

    Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

  • Hallo Rainer

    Ich habe es direkt über pself->VI_bounds.R_xxx versucht und der Compiler hazt dann reklamiert, dass mein GenPrimary keine solche Instanz besitzt.

    Heisst das, ich muss in einer GenClass immer ein ObjDerefVis() verwenden, wenn ich auf die VisClass-Instanzen deren zugreifen will? Das war ir so nicht bewusst :/