Das Gegenteil zu StayOnTop



  • Hi, hab da eine Frage. Ich hab ein Programm, dass immer hinter allen geöffneten Fenstern ausgeführt werden soll. Für das Gegenteil gibt es ja StayOnTop.
    Kann mir jemand helfen dies zu realisieren?

    Hier hab ich auch schon was zu Delphi gefunden, nur bringt mich das nicht viel weiter:

    http://www.delphipraxis.net/topic17951,0,asc,0.html

    Mir hat jemand versucht es zu übersetzen in c++ nur geht das nicht so recht:

    void __fastcall TForm1::CreateParams(TCreateParams Params)
    {
      CreateParams(Params);
      Params->WndParent=GetDesktopWindow();
      Params->Style=WS_CHILD;
    }
    

    Er scheitert immer an Params.

    [C++ Fehler] Unit1.cpp(109): E2288 Zeiger auf Struktur auf linker Seite von -> oder von ->* erforderlich*

    Er nimmt Param irgendwie nicht an.
    Danke im voraus für die Hilfe!



  • Hallo,

    Params ist ja auch kein Pointer
    also dann so

    void __fastcall TForm1::CreateParams(TCreateParams& Params)
    {
      CreateParams(Params);
      Params.WndParent=GetDesktopWindow();
      Params.Style=WS_CHILD;
    }
    


  • Hallo

    das ganz muß schon zumindestes so aussehen :

    void __fastcall TForm1::CreateParams(TCreateParams Params)
    {
    CreateParams(Params);
    Params.WndParent=GetDesktopWindow();
    Params.Style=WS_CHILD;
    }
    

    oder so

    void __fastcall TForm1::CreateParams(TCreateParams* Params)
    {
    CreateParams(Params);
    Params->WndParent=GetDesktopWindow();
    Params->Style=WS_CHILD;
    }
    

    Aber ich frag mich, warum so umständlich Wenn du ein Fesnter nicht im Vordergrund haben willst, zeig es gar nicht an.

    bis bald
    akari



  • Hallo,

    Vermutlich soll eine Form den Desktop "ersetzen", und der kommt net nach vorne oder 🙂

    mfg cb



  • Hi, danke für die schnelle Antwort aber wie ruf ich das am besten auf? Oder hat jemand eine Idee wie ich das am besten machen kann. Muss ja nicht nach dem Code den ich gepostet habe gehen.

    Und ja genau, das Programm soll eine Art "kleiner Desktop" sein.



  • Das rufst du garnicht auf. Diese Definition kommt ganz unten an das Ende der Deklaration deiner Hauptform.
    So etwa

    class TForm1: public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    //.. usw.
    
    void __fastcall TForm1::CreateParams(TCreateParams& Params)
    {
      TForm::CreateParams(Params);
      Params.WndParent=GetDesktopWindow();
      Params.Style=WS_CHILD;
    }
    
    }; //Ende der Deklaration
    


  • Ja jetzt gehts zwar aber komischerweise tut er genau das Gegenteil! Er ist jetzt die ganze Zeit vorne anstatt hinten...Hä?
    Aber trotzdem Danke!



  • Das diese Funktion dein gewünschtes Verhalten erzeugt habe ich nicht gesagt.
    Ich teile übrigens akaris Meinung, dass sowas sinnlos ist. Wenn man ein Fenster nicht im Vordergrund haben will warum dann anzeigen. Man könnte es in den Taskbar packen oder minimieren.
    Bezüglich der Styles
    Window Styles
    Extended Window Styles



  • Hallo Braunstein,

    carstenbauer schrieb:

    Vermutlich soll eine Form den Desktop "ersetzen", und der kommt net nach vorne oder 🙂

    Deswegen ist es nicht sinnlos. Er will das Verhalten des Desktops imitieren: Immer im Hintergrund aber da und sichtbar. Deswegen is dein Vorschlag das Programm in den Tray zu packen sinnlos.

    mfg cb



  • Ok, das habe ich wohl überlesen.
    Wenn dieses hinten liegende Fenster nie nach vorne kommt und somit direkt auch nicht benutzt wird, würde es doch reichen ein Bitmap (oder so) auf den Screen zu malen. Man müßte nur irgendwie für den Refresh sorgen.
    Eine andere Variante wäre SetWindowPos.
    Damit kann man die Z-Order verändern und mit HWND_BOTTOM wäre es ganz hinten. Man müßte nur dafür sorgen, dass es nicht wieder vorkommt.



  • void __fastcall TForm1::FormPaint(TObject *Sender)
    {
       SetWindowPos (Handle, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    }
    


  • Danke für die Antwort aber komischerweise bringt das keinen Meter etwas...irgendwie komisch...



  • Also bei mir schon. 🙄
    Das Fenster bleibt immer im Hintergrund.
    Das muss im OnPaint Ereignis stehen.



  • Ich weiß...bringt aber irgendwie nichts...



  • Hallo ElBartoME,

    ich muss mich setwin anschliessen, funktionert einwandfrei. Dürfte genau das sein, was du gesucht hast.

    mfg cb



  • Hast du die Eigenschaft OnPaint im Objektinspektor gesetzt? Setz mal einen Breakpoint rein, um zu sehen, ob die Funktion überhaupt aufgerufen wird.



  • Ich weiß woran es liegt. Ich benutze TransparentColor in meiner Form. Wenn ich es ausschalte gehts. Ich verstehe das nicht. Woran kann das liegen?


Anmelden zum Antworten