Handle für wxFrame



  • Hallo zusammen,

    habe folgendes Problem, dass ich versuche in ein schon bestehendes Programm wxWidgets zu integrieren. Der alte Code sieht folgendes vor, dass auf die Fenster mittels GDI Funktionen gezeichnet wird. Zuerst wird der Handle des aktuellen Fesnters geholt. Danach wird der entsprechende Device Context reserviert. Und im letzten Schritt wird dann auf das Fenster (mittels Handle und DC) gezeichnet.

    Ich möchte nun, dass ich statt des alten Fensters ein wxFrame setze und darauf zeichnen lasse. Habe versucht mit der Methode "wxFrame::GetHandle()" den entsprechenden Handle für den Frame zu bekommen, damit die alten Methoden mit diesem Handle weiterarbeiten können. Erste Frage ist, ob man generell so vorgehen kann/sollte? Es soll also so sein, dass ich über die Applikation ein wxFrame generieren lasse, danach als Rückgabewert den entsprechenden Handle mir geben lasse und dann mit Windowsnahen Funktionen versuche auf den Frame zu zeichnen.

    Im Moment ist es so, dass der Frame zwar angezeigt wird, man aber überhaupt keine Zeichnungen erkennen kann. Kann mir einer vielleicht einen Rat geben, wie man dieses Problem umgehen kann oder ob es einen andere, elegantere Variante gibt?

    Falls es mir nicht gelingt über die älteren Methoden auf den Frame zu zeichnen, so muss ich im Prinzip das ganze Programm und die Logik entsprechend für wxWidgets umschreiben. Habe gedacht, dass man dieses Problem eben so wie oben beschrieben umgehen kann. (Kann man mit GDI - Methoden auf einen wxFrame zeichnen?)

    Vielen Dank für die Antworten
    Gruß


  • Mod

    Also ich weiss das das nicht unmöglich ist, evtl. ist es einfacher diese Funktionalität in einem wxPanel abzubilden,
    wenn es nur um das reine Zeichnen geht. Aber evtl. lohnt es sich auch den alten Code einfach in den Neuen zu überführen,
    und dann einen wxDC zu nutzen.

    Ansonsten, das WindowHandle müsstest du mit GetHWND bekommen.

    Evtl. musst du den Code aber auch im OnPaint EventHandler aufrufen...



  • Die Paint Methode sollte man schon implementieren, auch wenn diese nur einen Aufruf deines alten Paint-Codes entält. Das native Handle bekommt man sicherlich auch, mußt du halt nur von void* nach HWND casten. Und das wxFrame ist auch nicht das wo du bestimmt reinzeichnen willst? Ist doch das Fenster mit Titelleiste usw. Ist bestimmt nicht im Sinne des Erfinders. Mußt du das wxPanel zum Zeichnen benutzen.



  • Ja ihr habt schon recht.. wxFrame soll später als MainFrame dienen auf dem wxPanels gesetzt werden. Dann wird auf die Panels gezeichnet statt auf das Frame.

    Doch ich habe dennoch das Problem, dass ich weder auf den Frame noch auf das Panel zeichnen kann. Schön wäre es, wenn ich zusätzlich zu der GetHWND() - Methode eine Funktion hätte, die mir das Device Context zu der jeweiligen Komponente (Frame, Panel usw.) geben könnte.

    Muss halt zum Zeichnen sowohl den Device Context als auch den Handle übergeben.
    Bin mir auch gerade nicht sicher, ob er im Programm mit den richtigen Handles und DC arbeitet, da ich halt nix auf dem Frame sehe.

    Habt ihr antworten? 😉
    Danke


  • Mod

    Du musst (egal ob frame oder panel) eine OnPaint Methode erstellen, in der du zeichnest.
    Momentan zeichnet der Frame einfach was er immer zeichnet, und übermalt damit alles was du gezeichnet hast 😉

    void MyFrame::OnPaint(wxPaintEvent& e)
    {
      wxPaintDC dc(this);
    // hier zeichnen.
    }
    

    Mit Connect(wxEVT_PAINT,wxPaintEventHandler(MyFrame::OnPaint)) musst du den Event dann noch registrieren.



  • Danke nochmal für die schnelle Antwort.
    Leider kann ich damit aber nicht ganz das realisieren was ich eigentlich machen möchte.

    Ich versuche es nochmal zu erklären. Das Ziel soll sein, dass ich ein (ziemlich mächtiges) altes Programm weiterhin benutzen kann. Dabei soll nach und nach die Funktionalität (Grafiken zeichen, Dialoge etc.) durch wxWidgets ersetzt werden. Leider kann man dieses nicht alles auf einmal umsetzen da das Programm riesig ist. Deshalb versuche ich jetzt, alte Methoden die schon definiert sind und auch funktionieren zu nutzen um auf neue Zeichenflächen von wxWidgets zu zeichen.
    Diese alten Methoden wie z.B.

    zeichenDreieck(Aktuelles Handle, DC);
    

    zeichnen Momentan auf HWND - Zeichenflächen (durch CreateWindow erstellt). Nun ist die Überlegung von mir, dass ich diese HWND - Zeichenfläche durch eine wxWidgets - Zeichenfläche (z.B. Panel etc.) ersetze.

    Dein Beispielcode von unten benutzt ein wxPaintDC. Das funktioniert super in wxWidgets - Applikationen, nur kann ich damit nicht meine alte Funktionen benutzen.(oder doch?)

    Die Frage ist auch generell, ob man nur mit einem wxPaintDC auf wxWidgets - komponenten zeichnen kann oder ob das auch mit anderen gehen. Kann ich also ein wxPanel generieren z.B.

    wxPanel *panel = new wxPanel(parent....);
    

    und dann einfach sagen

    panel->GetHWND();
    

    oder

    panel->GetDC();
    

    Dann könnte ich nämlich diese Rückgabewerte den alten Methoden übergeben und somit über die alten Mehtoden auf die neue wxWidgets - zeichenfläche zeichnen, oder??

    Noch eine kleine Frage zusätzlich. Kann man wxPanel einen parent übergeben der keine wxWidgets - Komponente ist? Also z.B. ein Fenster von Windows das mit CreateWindows(..)generiert wurde. Oder muss es z.B. ein wxFrame sein?

    Vielen Dank für die Antworten.
    Hoffe ich habe mein Anliegen deutlicher beschreiben können 🙂

    Gruß


  • Mod

    Du kannst die alten Methoden nutzen, musst dies aber im Paint Eventhandler von wxWidgets tun.
    Das HWND müsstest du laut Dokumentation mit GetHandle bekommen.



  • Ich habe auch so eine Bibliothek, die ein PDF direkt auf 'nen DC rendert.

    Dazu mache ich ganz normal meinen Paint-Event wie immer und rufe dann mit dem DC, den ich mir von wx hole die Bilbiothek auf.

    Ungefähr so:

    void PdfPage::OnPaint (wxPaintEvent& event)
    {
       wxPaintDC dc(this);
       Bibliothekenfunc((HDC)dc.GetHDC());
    }
    

Log in to reply