CheckBox....Farben selbst definieren....



  • Hi Pallaeon!

    Wieso funktioniert dann mein Ansatz nicht, den du hinter dem Link findest? 😕



  • Pellaeon schrieb:

    als erstes eine Steuervariabale des Steuerelementes anlegen oder per GetDlgItem(<RessourcenID>) nen Zeiger darauf holen.
    Im Haupdialog/-fenster die Nachricht WM_CTLCOLOR abfangen, dort geht als Parameter ein CWnd rein

    Nun in in der OnCtlColor die Handle vergleichen, um rauszufinden, welches Steuerelemnt gerade gezeichnet wird, also z.B.

    CEdit* pEdit GetDlgItem(IDD_EDIT1);
    if (pWnd->m_hWnd == pEdit->m_hWnd)
    {
          //Hier drinnen kann man jetzt mit dem CDC direkt auf das Steuerelement      
          //zeichnen
          //also auch die Hintergrundfarbe ändern
          pDC->SetBkColor(RGB(0,0,255)); //blau
    }
    

    auf diese Weise kann man jedes gewünschte Steuerelement beeinflussen

    Auf diese Art ändert man nur den Hintergrund und die Farbe des Textes welcher bei der CheckBox steht.

    ICh möchte aber die hintergrundfarbe des Rechteckts und die Hackenfarbe ändern.

    Kennt jemand noch eine andere Möglichkeit ausser es selbst zu "malen"?

    Gruß



  • Ich habe eine Hilfe gefunden.....hier der Link:
    http://www.codeguru.com/Cpp/controls/controls/checkboxcontrols/article.php/c5319/

    Ich habe es auch schon "eingebaut" aber ich habe folgedes Problem damit:
    - Ich habe zu jeder Checkbox auch einen Text der aber nicht komplett angezeigt wird. Es wird jeweis nur der erste Buchstabe angezeigt.
    - Ich will die CheckBox links vom Text stehen haben und nicht rechts davon (wie es halt standartmässig ist)

    Vielleicht kann sich mal einer die Dateien anschauen und mir sagen wie ich diese Dateien abändern muß das es soweit passt.

    Gruß Rudi



  • Das Problem mit dem Text habe ich nicht.
    Bei mir steht er zwar auch rechts, aber ich habe alle Buchstaben.

    Ist dein Control vielleicht einfach zu kurz? 😕

    Wegen der Ausrichtung:
    Ich habe gerade mal versucht, das umzustellen - das klappt nicht.
    Zur Not mach es dir einfach:
    Checkbox ohne Text ganz klein machen und dann ein Static zur Beschriftung daneben packen. 😃
    So habe ich das auch, damit die Schrift beim Deaktivieren nicht drau wird. 🙄



  • Ja das wäre eine möglichkeit. Ich habe dann halt ca. 100 CheckBoxen zu ändern was dann schon etwas zu aufwendig wäre.

    Es müßte doch aber möglich sein die Dateien von Codeguru so anzupassen das der Text rechts von der CheckBox steht und auch genügend platz ist (also der gesammte Text da steht).

    Ich weis nur leider nicht wie? Ich verstehe den Quelltext ehrlich gesagt nicht so richtig.

    Irgendwo müssen ja die "Einstellungen" zu der CheckBox stehen. Da muß man doch eingeben können ob der Text recht oder links von der CheckBox steht.

    Findet das nicht jemand?



  • Mit "Einstellungen" habe ich das schon versucht - kein Erfolg.

    CONTROL         "Check1",IDC_CHECK1,"Button",BS_OWNERDRAW | WS_TABSTOP,
                        85,250,41,10
        CONTROL         "Check2",IDC_CHECK2,"Button",BS_OWNERDRAW | BS_AUTOCHECKBOX | 
                        BS_LEFTTEXT | WS_TABSTOP,140,250,41,10
    

    Beim unteren siehst du das Flag BS_LEFTTEXT - leider wird es ignoriert. 🙄

    Vielleicht kannst du mit dem Ratschlag, den ich in diesem Beitrag erhalten habe, etwas basteln.
    Auch von dem ist das Ausprobieren meinerseits bisher noch am Zeitmangel gescheitert. 😞

    Ich habe nochmal in den Code von CColorCheck geschaut:
    Du musst dir mal genauer angucken, welches CRect in der Funktion CColorCheck::DrawItem für was zuständig ist. Zwei davon müssten für den Text und die "Kiste" zuständig sein.

    Da ich aber mit der Ausrichtung einverstanden bin, werde ich mich eher mit dem Aussehen des Häkchens beschäftigen. 😉



  • Erstmal vielen Dank.

    Wenn du es dann doch noch heraus bekommst kannst du es hier bitte erläutern?
    Mich würde auch interessieren wie man den Hacken en bissi Dicker machen kann. Wenn du weist wie....her damit.

    Danke trotzdem nochmal.



  • Also, wo der Haken gezeichnet wird, habe ich herausgefunden:

    CPoint startPt2 = pDC->MoveTo(4,7);
    
    		pDC->LineTo(7,11);
    		pDC->LineTo(10,3);
    
    		CPoint startPt3 = pDC->MoveTo(4,8);
    
    		pDC->LineTo(7,9);
    		pDC->LineTo(9,4);
    

    (Natürlich in CColorCheck::DrawItem, da ist alles, was mit der Anzeige zu tun hat.)

    Das muss man wohl erweitern, damit es besser aussieht.

    Edit:
    So, etwas besser ist es schon - aber das Quadrat ist größer als normal, das will ich noch ändern.
    Aber wenn dich nur der Haken stört, ersetze die Zeilen von oben gegen:

    int offset = 0;
    		pDC->MoveTo(3,7+offset);
    		pDC->LineTo(5,9+offset);
    		pDC->LineTo(12,2+offset);
    		offset++;
    		pDC->MoveTo(3,7+offset);
    		pDC->LineTo(5,9+offset);
    		pDC->LineTo(12,2+offset);
    		offset++;
    		pDC->MoveTo(3,7+offset);
    		pDC->LineTo(5,9+offset);
    		pDC->LineTo(12,2+offset);
    

    🙂



  • Den sieht man schon viel besser.

    Kannst du mir das vielleicht kurz erläutern wie sich der zusammensetz? Ich will es auch verstehen.

    ICh finde das net mit dem Text links neben der CheckBox!!!

    Wenn ich die CheckBox klicke und dann eine andere verschwindet die CheckBox!!!
    Komisch. Was kann das den sein? Weil ich noch ne BOOL zu der CheckBox habe?



  • Wie sich der zusammensetzt ist ganz einfach:

    Mach mal nen Screenshot von deinem Programm.
    Dann schneide die Checkbox aus und füge sie in Paint ein.
    Ansicht->Zoomfaktor->Benutzerdefiniert... -> 800%
    Ansicht->Zoomfaktor->Raster einblenden

    Nun kannst du ihn schon besser erkennen. 🙂

    Was ich da oben mache, sind "nur" drei übereinanderliegende Linien. Daher auch der Offset.
    Ich fange links an zu malen, schräg nach unten und dann wieder schräg nach oben.

    Ganz einfach - wenn man es mal raus hat. 😉

    Du kannst ja zum Angucken mal 1 oder 2 der Aufrufblöcke auskommentieren, dann siehst du es. Am besten den mittleren.

    Das "Malen" funktioniert genauso wie in jedem x-beliebigen Tutorial mit CDC.
    Alles, was du davon kennst, kannst du hier anwenden.

    Wenn du rausfinden willst, wie das Zeichnen funktioniert, dann kommentiere einfach immer wieder Stellen aus, dann siehst du, wo es fehlt.
    Oder, du packst dein Programm neben VC (es darf sich nicht überdecken!) und setzt dann in die DrawItem einen Breakpoint und gehst langsam mit F10 weiter. So siehst du, welche Zeile was tut.
    ABER:
    Erst mit F5 starten
    Dann Programm so hinschieben, dass die Checkboxen außerhalb des Bildschirmes sind (damit sie komplett neu gemalt werden müssen)
    Dann Breakpoint ganz am Anfang in die Funktion setzen.
    Dann das Programm wieder so ziehen, dass du es wieder sehen kannst.
    -> Du landest im Quellcode.
    Jetzt F10 immer wieder drücken und gucken, was passiert.

    Das kannst du beliebig oft machen. 🙂



  • Hey, bist du noch dran?
    Ich bin jetzt so weit, dass man meine Checkbox nur noch am zuckenden Focusrahmen vom Original unterscheiden kann. 😃



  • Ja ja bin noch dran....

    Ist ja super. Also wie die Ausrichtung funktioneritt ist mir allmählich klar. Ich kann auch die Ausrichtung der CheckBox auf die rechte Seite machen. klappt alles Soweit. Jetzt habe ich aber ein anderes Problem.

    1. Problem:
    Die Textlänge wird ermittelt um den Text zu schreiben. Der Wert der da raus kommt stimmt zwar mit den Anzahl der Zeichen überein aber man sieht nur den Anfang des Textes. Ich kann ihn zwar mittels eingegebenen Wert komplett anzeigen aber das sollte doch "flexibel" sein. Je nachdem wie lang der Text ist. Verstanden? Kann das was mit UNI - Code zu tun haben? Oder woran könnte das noch liegen. Pixel etc.... Wie kann ich das anpassen?

    2. Problem:
    Ich bin jetzt sowiet die CheckBox einfach auf die rechte Seite des Textes zu malen indem ich die Werte einfach verändere. Aber ich habe viele CheckBoxen mit unterschiedlichen Aussmaßen auf einem Dialog. Also müßte dies variabel sein. Man müßte vorher schauen wie groß die "Fläche" und Position auf dem Dialog ist damit ich die CheckBox variabel nach rechts malen kann.
    Verstehst du wie ich das meine? ICh müßte herausfinden welche Positionsdaten (Left, Right, Top, Bottom) mein Element auf dem Dialog hat. Weisst du wie?

    Gruß Rudi



  • Also, ich habe eben mit einem Blatt Karopapier gearbeitet um rauszufinden, wie das genau funktioniert.

    Male einfach mal alle CRects auf und dann siehst du, welches für was ist und auch mit welches Werten man rechnen muss. 🙂
    Sowas hieß bei uns in der Schule "Papierlauf".

    Wenn du nicht weißt, was ein Befehl macht, dann guck erstmal in die MSDN und wenn die das nicht hilft, frag hier.
    Um es dir komplett auseinanderzufusseln und noch zu kommentieren, habe ich leider zu wenig Zeit. Außerdem lernt man durch Ausprobieren besser. 😉

    Und die Textgröße wird hier berechnet:

    captionSize = pDC->GetTextExtent(buffer, strlen(buffer));
    

    Guck mal, ob du dazu was findest.



  • ICh habe das jetzt soweit hinbekommen. Einer der besten Tips war der mit dem verschieben der Fenster um zu sehen welche Zeile welches Ereignis nach sich zieht.

    Vielen Dank nochmal.

    Gruß Rudi


Anmelden zum Antworten