Edit Controls automatisch färben



  • also die Edit Controls haben nicht aufeinanderfolgende IDs, bzw. wäre es verdammter Zufall, und ich glaub eher an 10.000.000 € im Lotto als an das. Ich will mir nicht meine Edits neu schreiben, unnötiger Aufwand, da muss es doch eine Lösung geben!
    Peterchen, was willst du mir damit sagen? Ich versteh das nicht ganz!

    peterchen schrieb:

    Aufeinanderfolgende ID's
    Liste von ID's
    Array von HWND's / CWnd*



  • Die ID's müssen nicht unbedingzt aufeinanderfolgend sein.

    Du bräuchtestt aber ein Array mit den ID's, oder eine array von HWND's / CWnd *

    Wo du das herbekommstr, kommt aber darauf an, wie du die Edits erzeugst.



  • also ich erzeuge meine Edits statisch von hand im Resourceeditor und füge über den Klassenassi Member-Variablen zu. Wie lege ich nun so ein Array an und was ist denn besser? Eines mit CWnd Objekten oder eines mit den IDs? Für mich wäre glaub ich die IDs besser, da ich mit integer besser jonglieren kann wie mit CWnd-Objekten. Aber wenn das nur mit nem Handstand geht, dann werde ich CWnd Objekt-Array machen müssen 😉



  • Hallo Peterchen (oder auch gerne jemand anders)
    Die Idee ist ja gut aber wie kann ich sowas umsetzen? 😕



  • ping' mich heut abend noch mal an (msg hier). Muß grad fleißig Geld verdienen 🙂



  • OK dann verschieben wir das auf Montag bin nämlich jetzt im WE und bin für diese Woche fertig mit fleißig Geld verdienen. 😃
    Bis Montag



  • So Peterchen nun ist es wieder montag und ich hoffe du kannst mir erklären, was du da oben geschrieben hast. Wäre echt nett Danke schon im Voraus!



  • Kann mir bitte jemand sagen wie ich mir ELEGANT ein Array meiner EditFelder anlege? Ich brauch das Array um das im ersten Post beschriebene Problem zu lösen!



  • geht ja schon los....

    Wie "färbst" du die controls? Überschreibst du WM_CTLCOLORDLG?



  • Bisher färbe ich sie wie gesagt noch gar nicht aber sonst färbe ich sie mit hilfe von WM_CTLColor bzw der daraus entstenden FKT

    OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    

    🙂 Und nu?
    Danke schon im Voraus für die Hilfe!



  • In WM_CTLCOLORx müßtest Du ja das HWND vergleichen richtig?
    Du hkannst dir ein Array / std::set von entweder den ID's oder den HWND's anlegen. Im folgenden für die ID's:

    Erste Variante:

    const UINT ArrayIDs[] = { IDC_EDIT_1, IDC_EDIT_2, IDC_EDIT_3, ... };
    const UINT ArrayIDLen = sizeof(ArrayIDs)/sizeof(ArrayIDs[0]);
    
    const UINT * found = std::find(ArrayIDs, ArrayIDs+ArrayIDLen);
    if (found != ArrayIDs+ArrayIDLen)
    {
       // ID ist im array
    }
    

    Eine andere Variante (wenn du statt der "vielen ID's" lieber eine fette Schleife hackst:

    mit GetWindow(GW_CHILD), GetWindow(GW_HWNDNEXT) rasselst du durch alle Child-Fenster der Controls und siebst die Edit-Controls so aus:

    // HWND wnd ist ein edit?
    WNDCLASSEX wcx;
    ZeroMemory(&wcx, sizeof(wcx));
    wcx.cbSize = sizeof(wcx);
    ::GetClassInfoEx(wnd, &wcx));
    if (HIWORD(wcx.lpszClassName != NULL)  // ist ein string (kein Atom)
    {
      if (_tcscmp(wcx.lpszClassName) == _T("EDIT"))
      {
         // wnd ist ein EDIT
      }
    }
    

    (geht nur für "echte" Edits!)

    Die ID's der edits kannst du dir z.B. in einem std::vector oder std::set merken.



  • Was ist ein "echtes" Edit bzw. ein unechtes? 😕



  • WOW! 😮
    Bin erschlagen! Doch leider verstehe ich es nicht so ganz! Die zweite Variante fällt weg, da ich nicht alle Editfelder sondern nur bestimmte färben will. Die erste Variante ist nicht schlecht, nur die Zeile

    const UINT * found = std::find(ArrayIDs, ArrayIDs+ArrayIDLen);
    

    macht mir sorgen! Ich hätte jetzt eine Schleife durchlaufen wo ich die kommende ID mit jedem Eintrag vergleiche, aber deines gefällt mir schon besser! nur was ist std::find? der Compiler sagt mir:

    error C2653: 'std' : is not a class or namespace name
    error C2065: 'find' : undeclared identifier
    error C2440: 'initializing' : cannot convert from 'int' to 'const unsigned int *'
    Conversion from integral type to pointer type requires reinterpret_cast, C-style cast or function-style cast



  • Schleife ist auch ok.

    std::find nimmt fast beliebige Anfangs- und End-iteratoren, und sucht das erste Element, das paßt.

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcstdlib/html/vcsampsamplefindstlsample.asp

    C-Pointer sind auch zulässige iteratoren (#include <algorithm> fehlt noch)



  • also das mit find hab ich immernoch nicht hin gebracht, aber dafür mit ner einfachen for Schleife. Jetzt hab ich es wie folgt:

    bool found = false;
    	HBRUSH hbr = CRecordView::OnCtlColor(pDC, pWnd, nCtlColor);
    
    	const UINT ArrayIDs[] = { IDC_EDT_SUCHEN, IDC_EDT_KOMMANDO}; 
    	const UINT ArrayIDLen = sizeof(ArrayIDs)/sizeof(ArrayIDs[0]); 
    
    	for(int i=0; i<=ArrayIDLen; i++)
    	{
    		if (pWnd->GetDlgCtrlID() == ArrayIDs[i])
    		found = true;
    	}
    	CString EditText;
    	pWnd->GetWindowText(EditText);
    	if (found&& Test=="TRW:W1")
    	{ 
    		// ID ist im array 
    		pDC->SetBkMode(TRANSPARENT); // Hintergrund transparent machen (also KEIN SetBkColor nötig) 
    		HBRUSH B = CreateSolidBrush(RGB(123,123,123)); //Hintergrundfarbe 
    		return (HBRUSH) B; // Die Farbe soll genommen werden 
    	}
    

    Vielen Dank für deine Hilfe!!



  • J U H U U U U
    Ich hab das mit dem find doch hinbekommen, es war ein kleiner Fehler drin:
    In der Zeile:

    const UINT * found = std::find(ArrayIDs, ArrayIDs+ArrayIDLen,pWnd->GetDlgCtrlID());//der letzte Übergabeparameter hat gefehlt!
    

    Zusammen sieht das nun so aus:

    const UINT ArrayIDs[] = { IDC_EDT_SUCHEN, IDC_EDT_KOMMANDO}; 
    	const UINT ArrayIDLen = sizeof(ArrayIDs)/sizeof(ArrayIDs[0]); 
    
    	const UINT * found = std::find(ArrayIDs, ArrayIDs+ArrayIDLen,pWnd->GetDlgCtrlID()); 
    	if (found != ArrayIDs+ArrayIDLen) 
    	{
    		pDC->SetBkMode(TRANSPARENT); // Hintergrund transparent machen (also KEIN SetBkColor nötig) 
    		HBRUSH B = CreateSolidBrush(RGB(123,123,123)); //Hintergrundfarbe 
    		return (HBRUSH) B; // Die Farbe soll genommen werden 
    	}
    

Anmelden zum Antworten