[wxWidgets] Problem bei dynamischen Inhalten mit wxDC



  • Hallo, ich bin's mal wieder,
    ich brauche ein Timer-Anzeige ("hh🇲🇲ss") in einer Applikation, die mir in formatierter Schrift im Sekundentakt die vergangene Zeit anzeigt. Ich habe mal
    probiert, dies mit wxDC darzustellen, aber haut so nicht hin:

    class MyCanvas: public wxScrolledWindow {
    private:
       wxMirrorDC *dc;
       wxString str;
       bool m_mirror;
    public:
        MyCanvas::MyCanvas(wxWindow* parent, bool mirror, wxString &text)
        : wxScrolledWindow( parent, wxID_ANY,
                           wxDefaultPosition, wxDefaultSize,
                           wxHSCROLL | wxVSCROLL |
                           wxNO_FULL_REPAINT_ON_RESIZE) 
        {
        m_mirror = mirror;
        str = text;
        }
    
        void MyCanvas::OnDraw(wxDC& dcOrig) {
        dc = new wxMirrorDC(dcOrig, m_mirror);
           dc->SetFont( wxFont(12, wxMODERN,
                               wxNORMAL, wxNORMAL, true) );
       dc->DrawText( str, 110, 10 );
        }
    
        void MyCanvas::WriteString(wxString &text) {
        dc->DrawText( str, 110, 10 );
        }
    };
    

    Nicht wundern, der Ansatz ist absolut ohne Hirn, aber ich weiß es halt grad nicht besser 😞 . Wenn ich versuche die Methode WriteString anzuwenden, stürzt mein Programm ab.
    Wie kann ich ein Formatiertes Label auf meinem Fenster darstellen, das ich so handhaben kann, wie ich es brauche? wxStaticText o. ä. scheint nicht formatierbar zu sein.

    Vielen Dank im Voraus!

    Grüße,



  • Ich hab selbst eine Lösung für das Problem gefunden, irgendwie hatte ich ein Brett vorm Kopf.

    Für mein Problem ist wxStaticText am besten geeignet, da die Klasse, wie alle anderen Bedienelemente auch, von wxWindow abgeleitet ist, und diese Klasse praktisch alle benötigten Methoden bereitstellt. So können z.B. Vordergrund-/Hintergrundfarben oder der Schrift-Stil ganz einfach mit den Methoden gesetzt werden.

    MyFrame::MyFrame() :wxFrame( NULL, wxID_ANY, 
                  wxT(""),
                  wxDefaultPosition, wxSize(300, 300),
                  wxDEFAULT_FRAME_STYLE |
                  wxNO_FULL_REPAINT_ON_RESIZE)  
            {
                panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(400, 300));   
                wxStaticText *statictext = new wxStaticText(this, wxID_ANY, wxT("irgendein Schriftzug"), wxPoint(20, 20));
                statictext->SetFont(wxFont(20,wxFONTFAMILY_ROMAN,  wxFONTSTYLE_ITALIC, wxFONTWEIGHT_BOLD));
                statictext->SetBackgroundColour(*wxBLUE);
                statictext->SetForegroundColour(*wxRED);
            }
    

Anmelden zum Antworten