Winapi in Borland



  • 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



  • [quote="Pronto451"]

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

    Oh....
    das hab ich überlesen.
    Diese Funktion nur in selbst erstelleten Komponenten übereschreiben,
    die von TCostumPaintBox abgeleitet sind oder ähnliche (nicht TPanel).
    Wenn du das in der Standard TForm machst zeichnet sich die Form
    später sich nicht mehr automatisch selber.
    So sehe ich das zumindest, hab aber noch nie die TForm::Paint überschrieben.

    Grüsse



  • Hallo

    also irgendwie funktioniert das ganze noch nicht zu 100%

    Wenn ich folgendes mache:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::CreateParams(TCreateParams &Params)
    {
      TForm::CreateParams(Params);
      Params.ExStyle = WS_EX_TOOLWINDOW;
      Params.Style = WS_POPUP;
      Params.WndParent = GetDesktopWindow();
    }
    

    Sollte doch WS_EX_TOOLWINDOW dafür sorgen das ich in der Taskleiste keinen Button bekomme. Der ist aber da !?!?!?

    Wenn ich das hier mache:

    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    DWORD dwExStyle=GetWindowLong(Application->Handle,GWL_EXSTYLE);
         dwExStyle |= WS_EX_TOOLWINDOW;
         SetWindowLong(Application->Handle,GWL_EXSTYLE,dwExStyle);
    }
    

    funktioniert es.

    Ist das nicht das gleiche !?!?!

    Pronto451



  • Nein.

    In CreateParams() wird nur das Formular bearbeitet. Mit SetWindowLong(Application->Handle,[...]) wird die Application bearbeitet. Der "Button" in der Taskleiste ist also nicht der vom Form sondern der von der Application. Den mußt du zusätzlich mit dem SetWindowLong(Application->Handle,[...]) verstecken. (Sinnvollerweise in der WinMain vor Application->Run(), mit FormCreate hat das nicht so viel zu tun.)



  • Danke für die Info !!!

    Pronto451


Anmelden zum Antworten