Farbige Buttons

  • aus MSDN :


    WM_CTLCOLORBTN bug
    WM_CTLCOLORBTN does not perform as intended on Windows XP SP2/SP3 (and others?).


    To properly change the foreground and background color of BUTTON types (and others)
    Use the WM_CTLCOLORSTATIC message. You DO NOT use the BS_OWNERDRAW style!


    Example code (using a BUTTON, with style BS_AUTORADIOBUTTON):


    LRESULT CALLBACK WinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {


    switch (msg) {
    case WM_CTLCOLORSTATIC: {
    if ((HWND)lParam == filterNameOff) {
    static HBRUSH hBrushColor;


    if (!hBrushColor) {
    hBrushColor = CreateSolidBrush(RGB(0xFF, 0xFF, 0xFF)); // White background is returned
    SetBkColor((HDC)wParam, RGB(0xFF, 0xFF, 0xFF)); // White background for text
    }


    // Background color that is used to repaint the control (doesn't affect text background)
    return (LRESULT)hBrushColor;
    }
    }


    ....



    Warum funktioniert dieser Code nicht ?


  • Hallo Ralph


    Zitat

    'BS_AUTORADIOBUTTON Style setzen $09
    var static&= @Control("Button", "1", $5000000A, 16,16,60,20, %hWnd,0, %hInstance)

    Siehst Du was?
    Hast zwar den richtigen Style als Kommentarzeile angegeben aber was Falsches im Control gesetzt. :)
    Wenn Du nun noch darauf verzichtest, die Textfarbe setzen zu wollen sondern diese Farbe als BKColor verwendest, hat der Text diese Farbe als Hintergrund, wenn das Element fokussiert ist. Geht allerdings nur, wenn das Fenster Dialogstil hat. Die Textfarbe für Buttons aller Stile ist meines Wissens nicht änderbar, das geht nur über benutzergezeichnete Buttons. Ich lasse mich aber gerne belehren.


    Gruß Volkmar

  • Nachtrag, sie Sache mit dem farbigen Hintergrund funktioniert auch nicht wirklich. Nur das fokussierende Rechteck ändert sich, aber die Farbe kann ich nicht wirklich eingeben, die ergibt sich wohl eher aus einer Kombination von Farben. Ich kann die Farbe also ändern, aber nicht direkt angeben, was ich erreichen will.


    Gruß Volkmar

  • Hallo Volkmar,
    so ganz hab ich deinen Kommentar nicht verstanden.:-)


    BS_AUTORADIOBUTTON = $09


    $A = $09 | $01


    Wenn ich nur $09 setze bekomme ich einen anderen Buttontyp.
    Du kannst ja mal den letzten Wert von 1 bis A durchlaufen.
    Das Beispiel erzeugt bei mir ein Rechteck in der vorgegebenen Farbe.
    Wenn man draufklickt und die Maustaste links festhält, erscheint ein
    Button in grau.(win xp mit allen SP,xprofan 11.2)
    Gibt es einen Gdi Befehl, der dieses Grau ändert ?
    Wenn ich den engl. Text richtig verstehe , soll das ganze ohne
    ownerdrawstyle funktionieren ?
    Ich will niemanden belehren, ich versuche für mich ein paar Dinge zu
    verstehen.:-)


  • Erst mal, ich glaube, keiner fühlt sich durch Dich belehrt. Ist schon OK, daß Du versuchst, das mal durchzuspielen. So lernt man besser, als nur durch Abschreiben fremder Codes. Und da ist es auch OK, wenn du Fragen hast.
    Vielleicht meinst du auch meine Bemerkung, daß ich mich gerne belehren lasse? War vielleicht mißverständlich, aber ich meinte das allgemein. Vielleicht weiß einer in der Runde da noch eine Möglichkeit.


    Also zum Style: Was in den Dokumentationen nicht ausdrücklich drin steht, bei Buttons kannst Du die unteren 4 Bit nicht miteinander kombinieren. Du hast versucht, einen Radiobutton durch Kombination mit einem DefButton zu einem normalen Button zu machen. Das geht leider nicht.
    Sonst würde ja BS-AutoCheckBox + 1 auch einen Button ergeben. 3 + 1 ist 4 und damit erzeugst Du aber einen Radiobutton (ohne Autofunktion, den muß also die Anwendung steuern). Wie Deine Quelle schon sagte, das Einfärben geht nur mit Radiobuttons, und dazu zählen im weiteren Sinne auch Checkboxen. Damit funktioniert Dein Beispiel auch. Aber eben leider nicht mit normalen Buttons. Die werden intern grundsätzlich anders erzeugt und reagieren nicht auf Farbeinstellungen. Buttons werden unter Windows aus den 4 Ecken und Linien, die auf die gewünschte Größe verlängert werden und einem Pinsel, der das Innere füllt, zusammengesetzt. Diese Teilbitmaps sind im System verankert und der Pinsel zum Füllen und die Textfarbe werden durch Dein eingestelltes Farbschema festgelegt. Willst Du da was machen, dann denke ich, wäre wirklich nur ein besitzergezeichneter Button realisierbar.


    Gruß Volkmar

  • Glaub ich auch. Für solche Spielereien ist es vielleicht sinnvoll, eigene Control zu entwerfen, so wie es die SKControl.dll ja auch macht.
    Da sind beim Zeichnen wenigstens keine unerwünschten Nebenwirkungen dabei, die eine System-Controll-Class vielleicht von Hause aus mit sich bringt. Das Notizblatt aus meinen XProfEd-A z.B. hat so eine eigene Class. Ist nicht so schwer zu machen, eine API reicht zum Erstellen aus: RegisterClassEx. Es kann dann z.B. eine eigene Bitmap (genauer, ein Brush) als Hintergrund in hbrBackground angegeben werden, und die bleibt dann immer bestehen. Einfach mal ein wenig ausprobieren.

    Gruß, Frank

  • Hallo Horst


    Als Anwender, wenn ich ehrlich bin, kann ich Programme absolut nicht leiden, die sich nicht an das eingestellte Systemschema halten. Ich glaube auch eher, es geht dem Ralph auch gar nicht darum, einen farbigen Button zu verwenden sondern, er will einfach mal ausprobieren, was alles geht und wie es funktioniert. Und da wird es eben doch wieder interessant. Was passiert in einem Control und was kann man davon irgendwann mal verwenden. Und gegen einen einzelnen Button, der durch seine Andersartigkeit auf eine besondere Funktion hinweist, wäre auch nichts einzuwenden. Im richtigen Zusammenhang angewendet könnte das sogar nützlich sein.


    Gruß Volkmar

  • Sehe ich auch so. Bei der Anwendung, mit der ich dienstlich arbeite (wohl in VB erstellt) ist es sogar so, dass durch falsches Subclassing zwar das Control (Edit) schön gelb aussieht, der Text aber nicht mehr lesbar ist, wenn man gescrollt hat. :evil:

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!