CComboBox ohne 3D-Border



  • Hallo,

    ich möchte eine ComboBox erstellen, die einen 2D-Rand hat, also ungefähr so wie das auf dieser Webseite links oben ist ("Forum auswählen") 😉 .

    Gibt es da irgendeine Möglichkeit, ohne dass ich das Control mit einer abgeleiteten Klasse selber zeichnen muss? Ich dachte da an einen Style, den ich in der Create()-Methode mit angeben kann. Ich habe aber keinen passenden gefunden.

    Vielleicht gibts auch eine andere einfache Möglichkeit ohne selber zeichnen, falls das mit dem Style nicht geht.

    Danke für eure Hilfe.
    DaOne



  • Also, da bisher niemand geantwortet hat, gehe ich mal davon aus, dass das nicht so einfach mit einem Style angeben geht.

    Ich habe bisher 2 Seiten im Netz gefunden, die sich mit dem Thema befassen, und bei deren Lösungen nur der 3D-Rand übermalt wird und nicht das ganze Control selbst gezeichnet wird. Nur leider ist der eine Code mit der Winapi gemacht und der andere mit C#/.NET.:

    http://www.catch22.net/tuts/flatcombo.asp
    http://www.codeproject.com/cs/combobox/ComboBox_appears_flat.asp

    Von der Winapi und C# habe ich leider noch weniger Ahnung wie von MFC.

    Irgendwie wird das mit Subclassing gemacht, also indem die Nachrichten für das Zeichnen abgefangen werden, soviel habe ich bisher herausgefunden.
    In dem C#-Code wurde die Methode WndProc() überschrieben. Bei der MFC gibt es nur CWnd::WindowProc().

    Ich habe also mal eine Klasse erstellt, von CComboBox abgeleitet und die Methode überschrieben:

    //.h
    virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
    
    //.cpp
    LRESULT DropDown::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
    {
    }
    

    Das wars dann auch schon, weiter komme ich nicht, ich weiß nichteinmal was die Methode zurückgeben soll, return 0 geht schonmal nicht.

    Kann mir jemand ein paar Hinweise geben, was ich machen muss oder wo ich Informationen dazu bekomme?



  • Eine ComboBox, die du mit dem Ressourcen-Editor erstellt hast, sieht doch standardmäßig so aus, wie du es gerne hättest, oder nicht?

    Und wenn du sie mittels Create erstellst, sollte der Stil CBS_DROPDOWN doch auch für das gewüschte Aussehen sorgen, oder bin ich da völlig falsch dran?



  • Hm, stimmt, bei Windows XP ist das tatsächlich der Fall. Nicht aber unter einer früheren Windows Version oder wenn man beim Erstellen des Projekts in VS2005 den Haken bei "Allgemeines Steuerelementemanifest" entfernt. Dann sieht die ComboBox anders aus und hat einen 3D-Rand.

    Ok, das Beispiel mit der ComboBox auf der Webseite war natürlich falsch, hab gerade geschaut, das sieht auch nur unter XP 2D-mäßig aus, unter Win2k dagegen 3D.
    Ich dachte, das wär per CSS so designed (wie der Go-Button daneben) 😮 . Sorry deswegen.

    Ich habe den Haken allerdings weggemacht bei meinem Projekt, da die Buttons den Win2k-Look haben sollen, die Edit-Controls sind allerdings selber erstellt und 2D und daher sollten die ComboBoxen auch so aussehen. Aber ich glaube, ich lasse das jetzt erstmal so und werde mich evtl. später darum kümmern. Ich werde wohl sowieso nicht allzuviel Hilfe dafür erhalten, wenn es dieses Problem bei WinXP normalerweise gar nicht mehr gibt. 😞

    Trotzdem Danke für deine Mühe 🙂


Log in to reply