Winapi in Borland



  • Hallo

    also ich wieß nicht wo du das zwei Fenster siehst ?!?!

    Das ist ein Fenster mit etwas Test drauf und einem Button zum schließen. Nur das dieses Fenster den ganzen Desktop füllt, und hinter allen anderen Fenstern liegt.

    Ich habs mit dem Borland schon mit diesem Code versucht:

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

    und mit diesem:

    void __fastcall TForm1::CLButton1Click(TObject *Sender)
    {
    
      NewWindow = new TForm(GetDesktopWindow());
    
      // Größe und Position des Fensters setzen
      NewWindow->Left = 200;
      NewWindow->Top = 200;
      NewWindow->Width = 1024;
      NewWindow->Height = 768;
    
      NewButton = new TCLButton(NewWindow);
      NewButton->Parent = NewWindow;
      NewButton->Left = 200;
      NewButton->Top = 200;
      NewButton->Width = 100;
      NewButton->Height = 30;
      NewButton->Caption = "Hallo";
      NewButton->Visible = true;
    
      NewWindow->Visible = true;
    }
    

    Hat aber beides nicht richtig funktioniert.

    Pronto451



  • Wenn das immer noch die gleiche Frage ist, wie vor ein paar Tagen:
    Warum erstellst Du einen neuen Thread?
    Und die Anwort ist immer noch dieselbe: Vermultich nur über Active Desktop zu lösen.



  • Hallo

    ist noch das gleiche Projekt, aber jetzt halt eine andere Frage.

    Wie arbeite ich mit WinAPI und Borland zusammen?

    Pronto451

    PS. Das ist kein neuer Thread, sondern ein ganz andere, weil es um WinAPI geht. Ich kann auch nix dafür, das ich immer noch an diesem Problem arbeite ...



  • Na ja, wenn ich mich richtig erinner, ging es Dir darum auf dem Desktop Daten auszugeben und nicht ein Fenster hinter allen anderen Fenstern zu haben: Active Desktop.



  • Hallo

    also da errinerst du dich nicht richtig. Es ging darum ein Fenster hinter allen anderen zu haben und darauf Daten auszugeben. Ich habe gerade ein Programm gefunden das so etwas macht wie ich es auch machen will (http://www.sydatec.com/personaldesktop2/index.html), und das ist so weit ich es beurteilen kann nicht mit AktiveDesktop gemacht. Übrigens funktioniert das WinAPI Stückchen Code oben ja auch schon, nur wie krieg ich das jetzt mit der VCL unter einen Hut. Damit wir mal wieder zu der Frage zurück kommen.

    Pronto451



  • Das Stückchen WinAPI-Code ist ein komplette Anwendung, nicht nur ein Fenster... Da fangen die Probleme an.
    Keine Ahnung wie man das lösen könnte. Ich würde mal in der Projekt-CPP schauen, ob man dort die gewünschten Einstellungen für das Fenster machen kann.

    Welcher Code-Teil in dem (unleserlichen 😉 ) WinAPI-Konstrukt ist denn für das 'im Hintergrund bleiben' zuständig?

    EDIT: Wirf mal einen Blick auf TCreateParams in der BCB-Hilfe.



  • Hallo

    also hier der Ausschnitt der für das Fensterverhalten wichtig ist:

    hMainWnd = CreateWindowEx([b]WS_EX_TOOLWINDOW[/b],
                                    szMainClassName,        //Fensterklassenname
                                    szWinTitle,                    //Titel des Fensters
                                    [b]WS_CHILD[/b],       
                                    0, 0,                                //Position des Fensters wird von Windows festgelegt
                                    1280, 1024,                    //Breite und Höhe des Fensters
                                    (HWND)[b]GetDesktopWindow()[/b],                //Kein Eltern-Fenster
                                    NULL,                                //Kein Menü
                                    hInstCurrent,                //Aktuelles Instanzhandle
                                    NULL );                            //zusätzliche Parameter
    

    Wie bekomme ich so ein Fenster mit TForm hin ?



  • Ja, das schreit geradezu nach TCreateParams.



  • Hallo

    und wenn du mir jetzt noch verraten könntest wie ich "TCreateParams" anwende !!!
    In der Hilfe gibt es leiber kein Beispiel, wie ich das auf eine TForm anwende.

    Pronto451



  • Hi,

    RTFM (Read the fine MSDN) endlich darf ich das mal sagen 🙂

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/windows/windowreference/windowfunctions/setwindowpos.asp

    Folgenden Code hab ich neulich eingebaut um ein
    Programm immer im Vordergrund zu halten

    if(SpeedButton3->Down==true)
      SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
     else
      SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE);
    

    Ich glaub du brauchst anstatt HWND_TOPMOST das hier ---> HWND_BOTTOM
    bei den Parametern hinten weis ich ehrlich gesagt nicht genau was die machen.
    Kann man aber in der MSDN nachlesen (Link oben)

    Grüsse



  • füge z.B. folgendes in deine TForm ein:

    virtual void __fastcall CreateParams(TCreateParams &Params)
      {
        TForm::CreateParams(Params);
        Params.ExStyle = WS_EX_TOOLWINDOW;
        Params.Style = WS_CHILD;
        Params.WndParent = (HWND)GetDesktopWindow();
      }
    


  • Nur der Vollständigkeit halber: Die Funktion muß natürlich ein Member der Form sein.



  • Hallo,

    also das mit dem einfügen in die TForm hab ich noch nicht verstanden, wo einfügen ?!?!



  • Aus Howe's FAQ:

    Q: Change the window class name of a form

    Answer
    Override the CreateParams method of your form, and copy your window class name into the WinClassName member of the TCreateParams structure.

    //---------------------------------------------------------------
    // header file
    private:
        virtual void __fastcall CreateParams(TCreateParams & Params);
    //---------------------------------------------------------------
    // cpp file
    void __fastcall TForm1::CreateParams(TCreateParams & Params)
    {
        TForm::CreateParams(Params);
        strcpy(Params.WinClassName,"MotherPumpkin");
    }
    

    Note: The WinClassName member of the TCreateParams structure is an array of char. The array size is 64. You need to copy your window class name into this variable using strcpy. Do not attempt to assign the character string like this:

    Note: The TCreateParams structure also contains a WindowClass member. This member is the WNDCLASS structure that you would normally see in an API program. The WNDCLASS structure contains a member called lpszClassName that would normally contain the class name in a standard API program. However, in the VCL, lpszClassName conflicts with the WinClassName character array. I tried to use lpszClassName to assign the class name, but it didn't have any effect. I recommend that you use WinClassName instead.



  • Hi,

    mein Code kannst du überall verwenden.

    Den anderen muss überschrieben werden.... so wie ich das sehe

    in der unit.h

    private:
     virtual void __fastcall CreateParams(TCreateParams &Params);
    

    und in der unit.cpp

    virtual void __fastcall TForm1::CreateParams(TCreateParams &Params)
    {
    .
    .
    .
    .
    }
    

    Diese Funktion lässt du in der Form::Creat() aus aufrufen,
    dann ist das fenster von Anfang an ganz hinten

    Grüsse (zum Glück ist es mir heute nicht langweilig :-))



  • Hallo,

    also irgend wie bin ich heute einfach zu blöd und verstehe nur noch Bahnhof.

    Ich habe jetzt folgendes gemach:

    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::CreateParams(TCreateParams &Params)
    {
      TForm::CreateParams(Params);
      Params.ExStyle = WS_EX_TOOLWINDOW;
      Params.Style = WS_CHILD;
      Params.WndParent = (HWND)GetDesktopWindow();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
      CreateParams();
    }
    //---------------------------------------------------------------------------
    

    und in der H

    //---------------------------------------------------------------------------
    
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
      void __fastcall FormCreate(TObject *Sender);
    private:	// Anwender-Deklarationen
      virtual void __fastcall CreateParams(TCreateParams &Params);
    public:		// Anwender-Deklarationen
      __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    Wie oder besser mit was muß ich den CreateParams aufrufen ?



  • Hallo

    Gar nicht. Die Methode wird automatisch von TForm aus aufgerufen. Deshalb ist die Methode virtual, damit sie in abgeleiteten Klassen (zum Beispiel deiner TForm1) überschrieben werden kann.

    bis bald
    akari



  • Hallo an alle,

    also vielen Dank für die Hilfe jetzt hab ich endlich den Durchblick bei meinem Problem. Hab viel gelernt.

    DANKE

    Pronto451



  • Hi,

    😕
    Sorry müsst eingentlich ohne Aufruf funktionieren, da du sie ja überschrieben hast

    Grüsse



  • Hallo

    leider hab ich da aber noch ein klitze kleines Problem, denn wenn ich alle Fenster auf dem Desktop verkleinere verschwindet auch meine Taskleiste. Mit dem WinAPI Progrämmchen nicht ?!?!?

    Nur wenn ich die Höhe des Fensters um 1 Pixel kleiner machen als die Screenhöhe funktioniert es. Das sieht aber auf dem zweiten Monitor schlecht aus, weil dann die Desktop Wallpaper durchscheint.

    Pronto451


Anmelden zum Antworten