Listbox und Dialog mit Farbpalette



  • So funktioniert jetzt auch so, wie ich es geschrieben habe. Natürlich hatte die Sache auch einen Sinn: Ich will den User die Hintergrundfarbe, Textfarbe, Edithintergrund-, Edittext-, Button- und Buttontextfarbe auswählen lassen.
    Da habe ich aber wieder ein Problem: Und zwar braucht die Funktion SetTextColor als 2. Parameter einen unsigned long-Wert mein Wert ist allerdings ein HBRUSH. Ich habe das jetzt so gemacht:

    SetTextColor ((HDC) wParam, (unsigned long) Brush);
    

    . Allerdings nimmt er jetzt immer nur irgendein Rot-Ton oder Schwarz. Wie kann ich das richtig machen?

    Und dann noch ein Problem: Der Hintergrund des Fensters lässt sich farblich nicht verändern. Ich habe es schon mit InvalidateRect probiert, geht aber leider nicht.

    Mfg Ominion



  • Ominion schrieb:

    Da habe ich aber wieder ein Problem: Und zwar braucht die Funktion SetTextColor als 2. Parameter einen unsigned long-Wert mein Wert ist allerdings ein HBRUSH. Ich habe das jetzt so gemacht:

    SetTextColor ((HDC) wParam, (unsigned long) Brush);
    

    . Allerdings nimmt er jetzt immer nur irgendein Rot-Ton oder Schwarz. Wie kann ich das richtig machen?

    Sagmal, Du kennst die MSDN, oder ? Falls ja, solltest Du Dir dort auch mal die Erklärungen zu den relevanten Funktion/Strukturen, usw. durchlesen!
    Guck Dir das mal an, vllt kommst Du ja auch selbst drauf 🙄 :
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_8bsi.asp
    Und hier nochmal -zum Vergleich- die CHOOSECOLOR-Struktur: http://search.msdn.microsoft.com/search/Redirect.aspx?title=CHOOSECOLOR+Structure&url=http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/userinput/commondialogboxlibrary/commondialogboxreference/commondialogboxstructures/choosecolor.asp

    Ominion schrieb:

    Und dann noch ein Problem: Der Hintergrund des Fensters lässt sich farblich nicht verändern. Ich habe es schon mit InvalidateRect probiert, geht aber leider nicht.

    Das funktioniert logischerweise auch nicht mit InvalidateRect. Dazu brauchst Du WM_CTLCOLORLISTBOX, wenn es Dir um den Hintergrund einer ListBox geht.



  • Ja kenn ich, würde ich auch benutzen, wenn ich öfters und dann gleich für längere Zeit ins I-Net kommen könnte...
    mit WM_CTLCOLOR-Messages habe ich das ja schon...da funktioniert es ja auch, bloß eben beim Hintergrund des Hauptfensters geht das noch nicht...

    Mfg Ominion



  • Ominion schrieb:

    Ja kenn ich, würde ich auch benutzen, wenn ich öfters und dann gleich für längere Zeit ins I-Net kommen könnte...

    Kp, was für Probleme Du mit Deiner Internet-Verbindung hast, aber Du kannst Dir dir MSDN auch einmal komplett runterladen (was natürlich eine stehende Leitung für eine gewisse Zeit voraussetzt).

    Ominion schrieb:

    mit WM_CTLCOLOR-Messages habe ich das ja schon...da funktioniert es ja auch, bloß eben beim Hintergrund des Hauptfensters geht das noch nicht...

    Zeig mal Deinen Code.



  • W-Lan mit 56k-Modem (nein, es ist noch nicht ausgestorben!) weil T-Online zu blöd ist nen Router zu reparieren, den einer ihrer "Fachleute" kaputt gemacht hat...naja...seit dem kommen die nicht mehr ins Haus^^

    Erstmal, das mit der Textfarbe habe ich gelöst, bloß eben nicht so wie ich es eigentlich wollte. Aber es funzt...

    So ich weiß jetzt nicht, welchen Code du sehen willst.

    wc.style = CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc = WndProc;
    	wc.cbClsExtra = 0;
    	wc.cbWndExtra = 0;
    	wc.hInstance = hI;
    	wc.hIcon = LoadIcon (hI, MAKEINTRESOURCE (MAIN_ICON));
    	wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    	wc.hbrBackground = (HBRUSH) MainBrush;        //<- die Farbe soll geändert werden
    	wc.lpszMenuName = MAKEINTRESOURCE (MAIN_MENU);
    	wc.lpszClassName = MainWin;
    
    //So wähle ich die Farbe aus, und muss jetzt nur irgendwie die Farbe des Untergrunds vom Fenster ändern:
            case WM_COMMAND:
    			switch (LOWORD (wParam))
    			{
    				case 1:
                        //Hier wird die Farbe für den Hintergrund ausgewählt
    					MainBrush = OpenColorDlg ();
    
    					InvalidateRect (hMain, NULL, true);
    					InvalidateRect (hErrors, NULL, true);
    					InvalidateRect (hFile, NULL, true);
    					InvalidateRect (hSystem, NULL, true);
    					InvalidateRect (hPreferences, NULL, true);
    				break;
    
    				case 2:
    					EditBrush = OpenColorDlg ();
    
    					InvalidateRect (hMain, NULL, true);
    					InvalidateRect (hErrors, NULL, true);
    					InvalidateRect (hFile, NULL, true);
    					InvalidateRect (hSystem, NULL, true);
    					InvalidateRect (hPreferences, NULL, true);
    				break;
    
    				case 3:
    					MainText = OpenColorDlg (0);
    
    					InvalidateRect (hMain, NULL, true);
    					InvalidateRect (hErrors, NULL, true);
    					InvalidateRect (hFile, NULL, true);
    					InvalidateRect (hSystem, NULL, true);
    					InvalidateRect (hPreferences, NULL, true);
    				break;
    
    				case 4:
    					EditText = OpenColorDlg (0);
    
    					InvalidateRect (hMain, NULL, true);
    					InvalidateRect (hErrors, NULL, true);
    					InvalidateRect (hFile, NULL, true);
    					InvalidateRect (hSystem, NULL, true);
    					InvalidateRect (hPreferences, NULL, true);
    				break;
    			}
    		return 0;
    
    HBRUSH OpenColorDlg ()
    {
    	static CHOOSECOLOR cc;
    	static COLORREF crCustColors[16];
    
    	cc.lStructSize = sizeof (CHOOSECOLOR);
    	cc.hwndOwner = NULL;
    	cc.hInstance = NULL;
    	cc.rgbResult = NULL;
    	cc.lpCustColors = crCustColors;
    	cc.Flags = CC_FULLOPEN;
    	cc.lCustData = 0;
    	cc.lpfnHook = NULL;
    	cc.lpTemplateName = NULL;
    
    	ChooseColor (&cc);
    
    	HBRUSH rBrush = CreateSolidBrush (cc.rgbResult);
    
    	return rBrush;
    }
    

    Hoffe, dass das das ist, was du sehen wolltest, zumindest ist es das, wo ich das Problem noch habe.
    Mfg Ominion



  • Naja dieser Brush wird in der WNDCLASS(EX)-Struktur zugewiesen. Dann ist es klar, dass das Verändern effektlos ist. Also entweder Du änderst diesen Brush auch wirklich (SetClassLong(Ex)) oder Du malst unterm WM_PAINT-Handler mit FillRect oder ähnlichem rum.



  • SetClassLong...wie einfach so eine Lösung doch manchmal sein kann...danke.

    Habe aber noch eine Frage: und zwar wird in den Editfeldern die Schrift überlagert angezeigt. Also ich schreibe was, scrolle runter, und die Schrift überlagert sich...das wird wahrscheinlich daran liegen, dass die jetzt Farben o.ä haben, aber wie bekomme ich die Schrift wieder normal, ohne ihn markieren zu müssen?

    Mfg Ominion



  • Uji, ähm wie setzt Du denn die (neue) Schrift ( ➡ Code)?



  • Also, ich habe bei den WM_CTLCOLOR-Messages einfach noch SetTextColor () mit einer Variablen drin, und wenn der User sich die Farbe ausgewählt hat, dann sende ich InvalidateRect an alle Fenster, damit es neu gezeichnet wird. Die Variable (die ja jetzt mit den neuen Farbwerten vom User gefüütert wurde) wird dann eben wieder genommen, und dann habe ich eine neue Farbe.

    Mfg Ominion



  • Ich hatte Dich gefragt, wie Du die neue SCHRIFT setzt 😉 .



  • ich lasse den User nur die Schriftfarbe auswählen, mehr nicht.

    Mfg Ominion


Anmelden zum Antworten