Textfarbe in Editfeld



  • Hallo,

    habe ein Problem das ich einfach nicht alleine gelöst bekomme.
    In einem Dialog habe ich ein Edit Feld und darin wird geprüft ob der eingegebene Text gleich wie ein vorgegebener ist. Abhängig davon soll die Textfarbe angepasst werden. Allerdings wird nie der gesamte Text andersfarbig gemalt, sondern nur die neu eingegebenen Zeichen, da der restliche Text nicht neu gezeichnet wird.
    Nun weiß ich nicht welche Message ich an das Editfeld (Dialog) schicken müsste, damit der gesamte Text mit der neuen Textfarbe gezeichnet wird. Weder ein UpdateWindow oder ein WM_PAINT helfen??? Der Text wird neugezeichnet, wenn man in ein anderes Editfeld im Dialog klickt, allerdings konnte ich nicht herausfinden welche Messages dabei gesendet werden.

    static bool bValid = false;
    
    case WM_CTLCOLOREDIT:
    {
        if (GetDlgItem (hDlgUserInfo, EDIT) == (HWND)lParam)
        {
            if (!bValid)
                SetTextColor ((HDC) wParam, RGB (255,0,0));
            else
                SetTextColor ((HDC) wParam, RGB (0,255,0));
    
            return (BOOL) GetStockObject (WHITE_BRUSH);
        }
        else
            return FALSE;
    }
    break;
    
    case WM_COMMAND:
    {
        if (HIWORD (wParam) == EN_UPDATE)	
        {
            // Überprüfung
            if (same)
                bValid = true;
            else
                bValid = false;
        }
        break;
    }
    break;
    


  • das funzt so.


  • Mod

    Wenn das Edit Control read only ist, dann wird WM_CTLCOLORSTATIC gesendet!



  • Hmm ich habe wohl nicht verständlich machen können um was es mir geht.
    Das Edit Control ist nicht read-only und ich empfange auch ein WM_CTLCOLOREDIT.
    Ebenfalls wird der Text auch schon eingefärbt. Das geht auch schon.

    Ein Beispiel: Wenn der zu überprüfende Text "Hallo" sein sollte, sind die eingegebenen Buchstaben bis "Hall" rot, ist ja auch richtig. Wenn man dann das "o" eintippt, ist dieses grün, prinzipiell auch richtig, aber jetzt sollte "Hallo" komplett grün werden! Das bekomme ich nicht hin...



  • das geht so. ich habs doch vorhin aus langeweile selber ausprobiert.


  • Mod

    yogle schrieb:

    Ein Beispiel: Wenn der zu überprüfende Text "Hallo" sein sollte, sind die eingegebenen Buchstaben bis "Hall" rot, ist ja auch richtig. Wenn man dann das "o" eintippt, ist dieses grün, prinzipiell auch richtig, aber jetzt sollte "Hallo" komplett grün werden! Das bekomme ich nicht hin...

    Dann muss Du ein InvalidateRect auf das ganze Control loslassen. Das Edit Control zeichnet bei der Eingabenur die Änderungen neu. Nicht den gesamten Text.
    In Deinem Fall wird also das o eingegeben aber auch nur dieses Zeichen neu in grün gezeichnet. "Hall" bleibt unverändert.



  • Ne stimmt ja nicht MArtin. Ich habs doch selbst ausprobiert.



  • Doch mit InvalidateRect funktionierts nun. Danke Martin!



  • yogle schrieb:

    Doch mit InvalidateRect funktionierts nun. Danke Martin!

    funktioniert auch ohne, es ist unnötig.



  • Na dann zeig doch mal deinen kompletten funktionierenden Code!
    Also in meinem Fall ging es ohne InvalidateRect absolut nicht!


  • Mod

    Es ist wie ich geschrieben habe: Das Edit Control zeigt nicht bei jeder Tastatureingabe das komplette Feld neu an! Wenn die gesamte Färbung sich ändert durch die Eingabe eines Buchstabens, muss man ein InvalidateRect durchführen.



  • nein das stimmt ned, ich habs doch ausprobiert



  • BOOL CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam ) {
    	static BOOL bColorRed = TRUE;
    
    	switch(uMsg) {
    		case WM_CTLCOLOREDIT:
    			if(GetDlgCtrlID((HWND)lParam) == IDC_EDIT1) {
    				if(bColorRed)
    					SetTextColor((HDC)wParam, RGB(255,0,0));
    				else
    					SetTextColor((HDC)wParam, RGB(0,255,0));
    				return (BOOL)GetStockObject(WHITE_BRUSH);
    			}
    			return FALSE;
    
    		case WM_COMMAND:
    			switch(LOWORD(wParam)) {
    				case IDCANCEL:
    					EndDialog(hDlg, HIWORD(wParam));
    					return TRUE;
    
    				case IDC_EDIT1:
    					if(HIWORD(wParam) == EN_UPDATE) {
    						TCHAR szBuf[128];
    						GetWindowText(GetDlgItem(hDlg, IDC_EDIT1), szBuf, sizeof(szBuf));
    						if(_tcsstr(szBuf, _T("test"))) {
    							bColorRed = FALSE;
    						}	
    					}
    					return TRUE;
    			}
    			break;
    	}
    	return FALSE;
    }
    

Anmelden zum Antworten