Hintergrundfarbe eines textfeldes ändern
-
Hallo...
sry... ich mein ein CStatic feld.
kann man das nicht mit den standard funktionen realisieren??mfg
-
Hast du in das Projekt mal reingeschaut?
Das SIND Standardfunktionen.Du kannst bei keinem Control einfach so mal eine Farbe ändern. Je nach Control ist das mehr oder weniger Aufwand. Um eine eingene Klasse kommt du nur herum, wenn du das nur in einer Ansicht machen willst. Und für den Fall gibt es Lösungen im Forum, die müßtest du schon gefunden haben.
In dem Beispiel wird dir gezeigt, wie das geht. Wenn du im Forum schon mal gesucht hast, wirst du wissen, dass du besonders auf die OnCtlColor Funktion achten musst. (*mitzaunpfahlwink*)
-
die OnCtlColor funktion hab ich mir angeschaut, und jetz grade geschafft zu implementieren. ich kann mein code sogar kompilieren wenn ich hier
HBRUSH CMaxMidiProtoDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if(pWnd->GetDlgCtrlID() == IDC_BOOK1) { pDC->SetTextColor(RGB(95,100,144)); //pDC->SetBkColor(RGB(255,0,0)); return m_Brush; }
statt return m_brush;
return 0;
schreibe.
ich hab nämlich keinen blassen schimmer wie ich eine membervariable vom typ cbrush anlege....peinlich... ,-)
-
Okay, stellen wir uns mal doof:
Wie legst du eine Membervariable vom Typ UINT oder BOOL oder so an?
Genauso machst du das mit einem CBrush.Stellen wir uns etwas weniger dumm, denn ich denke, du hast weniger mit dem Anlegen als mit dem Füllen das Problem:
Füllen (würd ich im Konstruktor machen):m_brsBkGnd.CreateSolidBrush(RGB(255,255,255)); // Weiß
Löschen, das mußt du zwischen jedem Füllen und im Destruktor machen
m_brsBkGnd.DeleteObject();
Okay?
-
estartu_de schrieb:
Okay, stellen wir uns mal doof
das ist nicht schwierig... ,-)
ich hab jetz im OnInitDialog mit CBrush m_brush erstellt.
aber: jetzt kommt ne fehlermeldung in HBRUSH CDialog::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor)dass er das m_brush ned kennt...
-
Hmm, da scheinen dir Grundlagen zu fehlen.
Eine Membervariable einer Klasse packt man in den Header, also in die .h Datei.
Mach sie bitte protected, du brauchst sie ja außerhalb der Klasse nicht.
So eine Variable gilt innerhalb der ganzen Klasse und sie bleibt gültig, solange die Klasse gültig ist.In OnInitDialog kannst du sie füllen (statt Konstruktor), aber wenn du sie dort deklarierst, ist sie nur dort lokal gültig ung "stirbt" sobald diese Funktion verlassen wird. (Schau mal in ein Buch zu "Gültigkeitsbereiche/Lebenszeiten von Variablen".)
Jetzt klarer?
-
peinlich...
nein normalerweise weiss ich das...
kann ich dass noch auf silvester schieben???
-
Du meinst, du hast noch zu viel Restalkohol im Blut?
Okay, akzeptiert - aber hol dir schnell einen Kaffee.Jetzt klappts also?
-
ich komm jetz zurecht...danke...
das mit dem kaffee ist ne gute idee...
-
hallo
jetz gibts schon wieder probleme...
ich hab in OnInitDialogm_brush.CreateSolidBrush(RGB(0,0,0));
stehen.
unter der OnInitDialog hab ich folgende funktion:
HBRUSH Property::OnCtlColor(CDC *pDC, CWnd *pWnd, UINT nCtlColor) { HBRUSH hbr = Property::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd->GetDlgCtrlID() == IDC_DISPLAYTEXT) { pDC->SetTextColor(RGB(0,0,0)); pDC->SetBkColor(RGB(255,255,255)); return m_brush; } return hbr; }
aber nun bekomm ich an dieser stelle
m_brush.CreateSolidBrush(RGB(0,0,0));
einen Fehler. Das CStatic Feld hat auch die farbe nicht gewechselt...
hab keine Ahnung warum
-
Was für einen Fehler?
-
Debug Assertion Failed
kommt aber nur vor wenn ich ein zweites mal den dialog öffne...
wenn ich auf ignorieren klicke läufts normal weiter, aber dass kanns ja auch ned sein...
-
Drück bitte wiederholen, das ist kein Fehler sondern ein "du hast da Mist gemacht, guck mal" von der MFC.
Dann zeig den Code, wo er steht.
-
er bleibt bei dieser zeile stehen
ASSERT(m_hObject == NULL);
kannst du was damit anfangen?
-
Da ist schon was da, was nicht da sein darf.
Um zu sagen, WAS schon da ist, müßte ich den Aufrufstack kennen (welche Zeile ist die aus deinem Code?) und die Funktion um den ASSERT herum.
Ich vermute, du machst ein zweites Mal CreateSolidBrush ohne ein DeleteObject dazwischen.
-
hey du kennst dich ja gut aus ;-)...
kaum schreibt man ein deleteobject dazwischen, schon läufts wieder...
aber es wird immer noch ned weiss....
-
Das mit dem DeleteObject hatte ich dir aber geschrieben, lies mal weiter oben.
Kommt er überhaupt in die Funktion? Setz mal einen Breakpoint rein oder ein TRACE (also in die if, außerhalb kommt er mit Sicherheit lang...).
-
nein er kommt nicht in die funktion rein...
-
Hast du es in die Messagemap eingebunden?
Ist die ID richtig?
Mach mal "Alles neu erstellen".Wenn es dann immer noch nicht geht bin ich langsam ratlos.
-
hallo
erstmal die gute nachricht...
es wird endlich mal die HBRUSH funktion aufgerufen.
Allerdings scheitert er dann an der if abfrage. ich hab die ID 1:1 aus dem Wizard rauskopiert. die muss stimmen.ja ich habs in die messagemap eingebunden
ja ich hab alles neu erstellt