VCL Komponenten verwenden



  • Hallo Forum,

    Ich habe meinem Sohn, der mit VCL arbeitet, neulich einige VCL-Komponenten gekauft, mit denen er Menüs und Toolbars im Stil von Office 2003 und 2007 darstellen kann. Nun wollte ich fragen, ob ich diese Controls auch in WinAPI benutzen könnte.

    Ich wäre sehr froh, wenn ihr mir helfen könntet.



  • Uli schrieb:

    Nun wollte ich fragen, ob ich diese Controls auch in WinAPI benutzen könnte.

    Zunächst kannst du Code, der mit VCL-Komponenten arbeitet, natürlich nur im C++Builder kompilieren.

    Es ist durchaus möglich, VCL-Komponenten innerhalb einer WinAPI- oder MFC-Anwendung zu benutzen. Für die Verwendung von VCL-Controls mit nicht von der VCL gewrappten Fenstern gibt es die Eigenschaft TWinControl::ParentWindow, der du das Fenster zuweisen kannst.
    (Falls du die VCL aus MFC heraus benutzt, ist das hier vielleicht von Interesse für dich.)

    Ein kleines Beispiel:

    #include <windows.h>
    #include <vcl.h>
    #include <StdCtrls.hpp>
    #include <memory>
    
    // ...
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       static TButton* btn = 0;
       static std::auto_ptr <TComponent> ownerComponent;
    
       switch (message)
       {
       case WM_CREATE:
          ownerComponent.reset (new TComponent (0));
    
          btn = new TButton (ownerComponent.get ());
          btn->ParentWindow = hWnd;
          btn->Left = 10;
          btn->Top = 10;
          btn->Width = 120;
          btn->Caption = "My VCL Button";
          return 0;
    
       case WM_DESTROY:
          {
             PostQuitMessage(0);
             return 0;
          }
       }
    
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    

    Damit du nun allerdings den Formulardesigner benutzen kannst, muß dein Fenster schon eine von TForm abgeleitete VCL-Klasse sein. Alternativ wäre es möglich, ein Frame im Formulardesigner zu entwerfen und dann, wie oben gezeigt, das gewünschte Fenster als ParentWindow zu setzen.



  • Vielen Dank! Das hat mir sehr geholfen. Zwar hat der Code nicht sofort geklappt, aber nach ein paar Änderungen funktionierte er.

    Für alle, die es interessiert:

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
       static TButton* btn = 0;
    
    switch (message)
       {
       case WM_CREATE:  btn = new TButton("hallo");
                        btn->ParentWindow = hWnd;
                        btn->Top = 190;
                        btn->Width = 200;
                        btn->Name = "Button2";
                        btn->Caption = "Hallo, ich bin ein VCL-Button";
                        return 0;
    
       case WM_DESTROY:
          {
             PostQuitMessage(0);
             return 0;
          }
       }
    
       return DefWindowProc(hWnd, message, wParam, lParam);
    }
    


  • Uli schrieb:

    Vielen Dank! Das hat mir sehr geholfen. Zwar hat der Code nicht sofort geklappt, aber nach ein paar Änderungen funktionierte er.

    Gewöhnlich funktioniert der Beispielcode, den ich poste; meist, weil ich ihn selbst teste. Was hat denn genau nicht geklappt?

    Und wie genau kommst du auf den Gedanken, dem Button im Konstruktor ein Stringliteral als Fensterhandle zu übergeben? Dir ist schon klar, daß das früher oder später zu einem äußerst schwer zu findenden Laufzeitfehler führen wird?

    Wenn du zudem nicht eine Komponente als Owner des Buttons einträgst (die du auch - wie in meinem Beispiel - im Konstruktor übergeben kannst), bist du selbst für die Freigabe verantwortlich. In meinem Beispiel veranlaßt das die Komponente, die selbst vom std::auto_ptr freigegeben wird.


Anmelden zum Antworten