Wieso erscheint wxWidgets im Windows Classic Look?



  • Ich habe mich mal (mehr durch Abschreiben als durch selbst Coden) an wxWidgets herangewagt. Allerdings ist mir aufgefallen, das das unter Windows erstellte Fenster im Classic Look erscheint (siehe zum Beispiel den Button). Ist das der Standard oder wie kann ich das auf ein anderes bzw. das Luna-Theme umschalten?

    Falls es hilft:

    //base.cpp
    
    #include <wx/wx.h>
    #include "base.h"
    
    IMPLEMENT_APP( HalloWeltApp )
    
    bool HalloWeltApp::OnInit() {
    	BasicFrame *frame = new BasicFrame( wxT("Hallo Welt!"), 50, 50, 200, 100 );
    	frame->Show( TRUE );
    
    	SetTopWindow( frame );
    
    	return TRUE;
    }
    
    BasicFrame::BasicFrame( const wxChar *title, int xpos, int ypos, int width, int height ) : wxFrame( (wxFrame *) NULL, -1, title, wxPoint(xpos, ypos), wxSize(width, height) ) {
    	panel = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxSize(200, 100) );
    
    	button = new wxButton( panel, wxID_OK, wxT("OK!"), wxPoint(10,10), wxDefaultSize );
    }
    
    BasicFrame::~BasicFrame() {
    }
    
    BEGIN_EVENT_TABLE( BasicFrame, wxFrame )
    	EVT_BUTTON( wxID_OK, BasicFrame::OnClickButtonOK )
    END_EVENT_TABLE()
    
    void BasicFrame::OnClickButtonOK( wxCommandEvent &event ) {
    	Close();
    }
    
    //base.h
    
    #ifndef BASE_H_INCLUDED
    #define BASE_H_INCLUDED
    
    class HalloWeltApp : public wxApp {
    	public:
    		virtual bool OnInit();
    };
    
    class BasicFrame : public wxFrame {
    	private:
    		wxPanel* panel;
    		wxButton* button;
    
    		DECLARE_EVENT_TABLE();
    	public:
    		BasicFrame( const wxChar *title, int xpos, int ypos, int width, int height );
    		~BasicFrame();
    		void OnClickButtonOK( wxCommandEvent &event );
    };
    
    #endif // BASE_H_INCLUDED
    

    http://img410.imageshack.us/my.php?image=wxwidgetsha4.gif



  • Da fehlt das Manifest.

    Du kannst entweder selbst eines erstellen oder einfach wx/msw/wx.rc includen (in deinen .rc).



  • Kann das nochmal jemand genauer erläutern, bitte? Ich muss also wx.rc aus wx/msw "includen" um den gewünschten Look zu erhalten. Aber wo muss ich diese include Anweisung denn schreiben? Ein .rc-File habe ich nicht. Falls ich das anlegen muss, kann mir bitte jemand sagen wie?



  • Also im Grunde hat das überhaupt nichts mit wxWidgets zu tun. Das Manifest gibt es seit XP, es gibt tausende Artikel dazu im Netz.

    Bei WX wird nun eine Ressource-Datei mitgeliefert, die das Manifest bereits enthält. Vernünftige IDEs erstellen dieses Manifest ebenfalls automatisch.

    Wenn du das bei wx mitgelieferte Manifest verwenden willst, musst du es natürlich in dein Projekt mit einbinden. Eben besages msw/wx.rc. Dazu schreibst du in deine RC einfach #include "wx/msw/wx.rc". Wenn du keine RC hast, wird's aber Zeit. Du brauchst spätestens dann eine, wenn du deiner Anwendung ein Icon verpassen willt. Eine RC-Datei ist 'ne Simple Text-Datei, die vom Ressource-Compiler compiliert und zu deiner Exe gelinkt wird. Keine Ahnung, wie das bei deiner IDE ist, bei vernünftigen IDEs fügt man die RC-Datei einfach dem Projekt hinzu.



  • Ok, deine Antwort war sehr aufschlussreich. Vielen Dank schonmal dafür.

    Erstes Ding:
    Ich habe jetzt einfach eine Datei namens base.rc zum Projekt hinzugefügt.

    //base.rc
    
    #include "wx/msw/wx.rc"
    

    Wenn ich das ganze Projekt jetzt allerdings kompiliere kommt die Fehlermeldung

    error: `wxWindowMenu' does not name a type
    

    welche sich auf Zeile 30 der wx.rc Datei im Ordner msw bezieht.

    Zweites Ding:

    frenki schrieb:

    Vernünftige IDEs [...]

    Ich benutze für wxWidgets die IDE Code::Blocks. Welche IDE findest du denn vernünftig, bzw. kannst du empfehlen?



  • codeblocks IST gut und vernünftig, er scheint eine anspielung auf ms vc++ zu machen...



  • Code::Blocks ist okay. Ich verwende es selbst, wenn ich MinGW als Compiler verwende. Das war bisher aber nur bei einem Open Source Programm der Fall, wo ich nur ein paar kleine Änderungen gemacht habe. Ich habe damit noch nie ein neues Projekt erstellt.

    Ansonsten verwende ich Visual Studio, den finde ich in der Tat verünftig. Nicht wirklich gut (im Gegensatz zum Visual Age C++, der 1998 schon das hatte, was MS hoffentlich mit Phoenix auch schafft) aber durchaus vernünftig. Das Manifest ist eine ganz normale Projekt-Option, genau wie ich es von einer Windows-IDE erwarte.



  • Weiß den noch einer Rat wegen dem "ersten Ding"?



  • Ok, jetzt klappt es. Allerdings weiß ich nicht wieso. Ich arbeite ja mit Code::Blocks. Wenn ich ein .rc-File einfach zum Projekt hinzufüge und dabei Build und Debug abharke reicht das anscheinend. Ich muss es nirgends per include Anweisung einbinden. So gibt es keine Fehler und das Fenster erscheint im gewünschten Luna Look.


Log in to reply