Edit Controls in Schleife färben



  • Hi zusammen ich habe einen Dialog in dem ich Editcontrols je nach Inhalt färben will allerding betrifft das nur bestimmte und nicht alle. Nun habe ich eine Funktion die auf ON_WM_CTLCOLOR() aufgerufen werden könnte. Die Funktion sieht folögendermaßen aus:

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

    Die Funktioniert TIpTop nur mein Problem ist, ich krieg ON_WM_CTLCOLOR nicht in meinem Dialog hin ich bekomm immer Linker-Fehler! Jetzt bräuchte ich Tips wie ich ohne WM_CTLCOLOR die Edits färben kann, oder Tips wie ich die Linkerfehler weg bekomme! (Die Linkerfehler treten auf obwohl vom Klassenassi erstellt!)
    DANKE schon im Voraus!



  • Hast du dein Projekt schon mal bereinigt und erneut kompiliert?



  • in wiefern bereinigt? ich hab es auch schon an einem anderen Dialog probiert! Geht das vielleicht bei popup Dialogen nicht?



  • Das mit dem Linker Fehler ist doch so ne Krankheit...

    Ich meinte deshalb mal den Debug bzw Release Ordner löschen und neu kompilieren oder mal in deinem Projekt die .opt und .ncb-Datei löschen und dann neu kompilieren



  • hm also das hilft auch nichts ich hab den debug den release die ncb die opt und die clw gelöscht, aber nichts desto trotz es geht immer noch nicht, dann hab ich ein neues Projekt angelegt und einen Dialog eingefügt der Klassenassi erstellt mir sogar die WM_CTLCOLOR Funktion automatisch (was er daheim nicht macht) und dann wieder Linker Fehler bei nem neu angelegten Projekt! Ich hab exakt das gleiche Spiel mal zuhause durchgezogen und es hat einwandfrei funktioniert, aber ich muss hier damit arbeiten, drum kann mir einer von euch sagen, wo da was fehlt? Kann ich ein ServicePack ziehen (ich habs 6er) oder liegt es vielleicht gar daran, oder sonst was keine Ahnung irgendwas. Oder woran könnte das denn liegen, da fehlt doch was oder???



  • ich hab mich da mal umgeschaut wo der Fehler liegen könnte. Ich bin in die DLGCORE.CPP in meinem Source Verzeichnis von meinem VC++. Da steht zumindest mal oben drin:

    // CDialog - Modeless and Modal
    
    BEGIN_MESSAGE_MAP(CDialog, CWnd)
    #ifndef _AFX_NO_GRAYDLG_SUPPORT
    	ON_WM_CTLCOLOR()
    #endif
    

    😮
    und weiter unten steht dann

    /////////////////////////////////////////////////////////////////////////////
    // Gray background support
    
    #ifndef _AFX_NO_GRAYDLG_SUPPORT
    HBRUSH CDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
    	// use helper in CWnd
    	return OnGrayCtlColor(pDC, pWnd, nCtlColor);
    }
    #endif //!_AFX_NO_GRAYDLG_SUPPORT
    

    Aber das passt do dann gar nicht zu der Fehlermeldung:

    DatumDlg.obj : error LNK2001: unresolved external symbol "public: struct HBRUSH__ * __thiscall CDialog::OnCtlColor(class CDC *,class CWnd *,unsigned int)" (?OnCtlColor@CDialog@@QAEPAUHBRUSH__@@PAVCDC@@PAVCWnd@@I@Z)
    Debug/ACRSQL.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.

    Kann mir denn wirklich keiner weiterhelfen? Es ist echt wichtig!



  • Hast du das schon mal in einen anderen Dialog eingebaut? Nur so zum Test? 🙂



  • was hab ich in nen anderen Dialog eingebaut? mein WM_CTLColor?

    s.o. ich habe schon ein neues Projekt angelegt und bekomm bei einer einfachen vom Assi erstellten ONWM_CTLCOLOR Linker Fehler s.o.

    😞



  • Okay, dann kann ich ja gleich mal gucken, ob mir das auch passiert.
    Hier erstellen nur gerade zwei VC das komplette Projekt... dauert etwas. 😉

    Houston? Wir haben ein Problem...
    Es kompiliert. 🙄

    BEGIN_MESSAGE_MAP(FehlerDlg, CDialog)
    	//{{AFX_MSG_MAP(FehlerDlg)
    	ON_WM_CTLCOLOR()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    HBRUSH FehlerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    
    	// TODO: Attribute des Gerätekontexts hier ändern
    
    	// TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll
    	return hbr;
    }
    

    Und jetzt? 😕



  • da ist wohl irgendwas in irgend ner Datei von mir kaputt oder fehlt, denn er sagt ja er kann die struct HBRUSH nicht finden. Ich hab mal Spaßeshalber

    HBRUSH CDatumDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
    {
    	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
    

    gemacht, da kann er zumindest mal Linken aber er kann halt nicht weil protected member function. Ich will auch nicht in de MFC rumpfuschen!
    Kannst du mal schauen welche Datei bei WM_CTLColor aufgerufen wird und mir die dann schicken? vermutlich sowas wie DLGCORE.cpp oder so. Denn es muss ja daran liegen. Darf ich mal ein Miniprojekt schicken das einfach nur einen Dialog öffnet, der dann CTL_COLOR macht? 😞



  • Klar, ich muss mich jetzt allerdings um die Besprechungsvorbereitungen kümmern - könnte etwas dauern.
    Aber ich vergesse das schon nicht. 🙂



  • Dankeschön, vielen Dank!
    Ist auch nur 27KB Danke Danke Danke!



  • Hat sich das verlaufen? 🤡



  • hab grad nochmal nachgeschaut ist erst 10:01 vom Server Raus hatten mal wieder Serverprobleme!
    Aber macht ja nichts, wir sind ja nur ein kleines Unternehmen! (*ironisch*)

    Dankeschön



  • Tja, jetzt gehts leider gleich los... ich melde mich, sobald ich dazu komme. 🙂



  • JO Danke!
    Hab jetzt noch was was ich statt der doofen Linker Fehler machen kann, hab ne Lösung für das Schichtenproblem (siehe COleDateTime allgemeines Problem)



  • --------------------Konfiguration: colortest - Win32 Debug--------------------
    Ressourcen werden kompiliert...
    Kompilierung läuft...
    StdAfx.cpp
    Kompilierung läuft...
    colortest.cpp
    colortestDoc.cpp
    colortestView.cpp
    MainFrm.cpp
    testcolDlg.cpp
    Generieren von Code...
    Linker-Vorgang läuft...

    colortest.exe - 0 Fehler, 0 Warnung(en)

    Ich habs nur ausgepackt und F7 gedrückt... 😕



  • oh man das hab ich vermutet! Bei mir kommen die Linkerfehler. Ich werd mal übers WE schauen wo mir meine WM_CTLCOLOR reinspringt und dann mal diese Datei von zuhause mitbringen und hoffen dass es dann weider geht, ich wünsche dir ein wunderschönes WE.

    UND VIELEN LIEBEN DNAK!



  • Du hast doch auch VC6 mit SP6? (Nur, dass es nicht daran liegt.)

    Du kannst die Datei nicht von zu Hause mitbringen. Jedenfalls nicht so ohne weiteres. 😞
    Du kannst ja nicht mal eben die MFC neu kompilieren. 🤡

    Da muss ne andere Lösung her. ⚠



  • VC6 SP6 JO!

    ja OK nur woher kommt die? (Die andere Lösung!?)
    aber vielleicht ist ja irgendwann ein File irgendwo verschwunden oder so kA wenn ich es dann unauffällig wieder rein schiebe, dann sollte es doch wieder tun, er findet dann plötzlich da wo er sucht wieder das was er will! (oder nciht?


Log in to reply