Statischen Text färben?
-
Und voraus.
-
Zum Problem: ListCheck gibt immer dasselbe zurück.
-
Ja, das habe ich am Anfang auch nicht so gehabt, aber wenn ich "return h" mache, bringt das auch nichts, bzw ändert nichts
MFG
FERNman
-
FERNman schrieb:
Ja, das habe ich am Anfang auch nicht so gehabt, aber wenn ich "return h" mache, bringt das auch nichts, bzw ändert nichts.
Das liegt daran, dass h der Rückgabewert einer deiner "Farb"-Funktionen zugewiesen wird. Und die geben auch alle dasselbe zurück.
Beachte, dass deine Variablen namens h in den unterschiedlichen Funktionen absolut nichts miteinander zu tun haben. Da findet keine magische Wertübertragung statt, nur weil die denselben Namen haben.
-
Noch ein Tipp: überlege dir mal wie du deine Farbfunktionen zu einer Funktion (mit einem weiteren Parameter) zusammenfassen könntest.
-
Ok, also ich habe die zwei Funktionen jetzt überarbeitet:
LRESULT ListCheck(WPARAM wParam, LPARAM lParam, TCHAR ListItem[256], HWND hPopup, int ID, LRESULT h) { COLORREF Farbe; if (ListItem[0] == 'R' && ListItem[2] == 't') { Farbe = fRot; } if (ListItem[0] == 'B' && ListItem[1] == 'l') { Farbe = fBlau; } if (ListItem[0] == 'G' && ListItem[1] == 'r') { Farbe = fGrün; } if (ListItem[0] == 'O' && ListItem[1] == 'r') { Farbe = fOrange; } if (ListItem[0] == 'R' && ListItem[1] == 'o') { Farbe = fRosa; } if (ListItem[0] == 'B' && ListItem[1] == 'r') { Farbe = fBraun; } if (ListItem[0] == 'G' && ListItem[1] == 'e') { Farbe = fGrün; } Färben((HDC)wParam, (HWND)lParam, ID, Farbe); return 0; }
Und:
LRESULT Färben(HDC hdc, HWND hCtl, int ID, COLORREF Farbe) { if (hCtl = Stunde[ID]) { SetBkColor(hdc, Farbe); } if (hCtl = Raum[ID]) { SetBkColor(hdc, Farbe); } if (hCtl = Lehrer[ID]) { SetBkColor(hdc, Farbe); } return (LRESULT)GetStockObject(HOLLOW_BRUSH); }
Nur weiß ich immer noch nicht, wie ich das nun dazu bringen soll, dass es sich färbt? Was muss ich denn dafür Zurückgeben?
MFG
FERNman
-
MFK schrieb:
Das liegt daran, dass h der Rückgabewert einer deiner "Farb"-Funktionen zugewiesen wird. Und die geben auch alle dasselbe zurück.
Mir ist durchaus bewusst dass diese Funktionen alle das selbe zurückgeben, aber das lustige ist ja, dass ich in meinem "Standard" ja auch nur "return (LRESULT)GetStockObject(HOLLOW_BRUSH);" zurückgebe, und da funktioniert es...
Der Unterschied liegt ja nur darin, dass es eine "Zwischenfunktion" gibt, und dass das ganze nicht in WM_CTLCOLORSTATIC passiert...
MFG
FERNman
-
So wie ich das sehe: übergibst du überhaupt bei ListCheck den richtigen Wert für den hDC (dh. wParam)?
Du solltest besser gleich HDC und HWND als Parameter für deine ListCheck-Funktion übergeben (so wie bei deiner neuen Färben-Funktion - apropos, gut gemacht ;-).
Mir scheint, du hast aber noch ein paar Grundlagen von C zu lernen...
Auch der letzte Parameter von ListCheck, nämlich LRESULT h, ist wohl überflüssig.
-
Danke für das Lob erstmal
Ja, also ich habe das jetzt mal gemacht, ich hoffe du hast das so gemeint:
LRESULT ListCheck(HDC hdc, HWND hCtl, TCHAR ListItem[256], HWND hPopup, int ID) { COLORREF Farbe; if (ListItem[0] == 'R' && ListItem[2] == 't') { Farbe = fRot; } if (ListItem[0] == 'B' && ListItem[1] == 'l') { Farbe = fBlau; } if (ListItem[0] == 'G' && ListItem[1] == 'r') { Farbe = fGrün; } if (ListItem[0] == 'O' && ListItem[1] == 'r') { Farbe = fOrange; } if (ListItem[0] == 'R' && ListItem[1] == 'o') { Farbe = fRosa; } if (ListItem[0] == 'B' && ListItem[1] == 'r') { Farbe = fBraun; } if (ListItem[0] == 'G' && ListItem[1] == 'e') { Farbe = fGrün; } Färben(hdc, hCtl, ID, Farbe); return 0; }
Funktioniert aber leider immer noch nicht
Falls es wichtig ist, ich rufe die Funktion so auf:
if (h = ListCheck((HDC)wParam,(HWND) lParam, ListItem, hPopup, ID, h)) return h;
Ich hoffe das ist Richtig :DD
Th69 schrieb:
Mir scheint, du hast aber noch ein paar Grundlagen von C zu lernen...
Ja warum glaubst du mache ich dieses Projekt :). Ich habe nun in diesen 2 Wochen schon so viel neues gelernt und vertieft, unglaublich
MFG
FERNman
-
Der Rückgabewert der Funktion ListCheck ist sinnlos. Ebenso sinnlos ist es, mit diesem Wert irgendetwas zu tun. Die Funktion sollte den Rückgabetyp void haben.
Der Parameter hPopup der Funktion ListCheck wird nicht verwendet. Benutz ihn, oder entferne ihn.
-
Ja, danke, aber das hilft mir nicht weiter, Codeverschönerung kann ich wenns funzt auch noch machen...
MFG
FERNman
-
FERNman schrieb:
Ja, danke, aber das hilft mir nicht weiter, Codeverschönerung kann ich wenns funzt auch noch machen...
Wenn du den Müll wegräumst, siehst du die Fehler besser.
Und noch eins:
= ist eine Zuweisung
== ist ein Vergleich
-
MFK schrieb:
= ist eine Zuweisung
== ist ein VergleichIst mir durchaus bewusst, aber du beziehst das sicher auf einen Fehler, wo liegt er ?
MFG
FERNman
-
Hallo,
ich beziehe mich auf folgenden Code:
//PopupProc if (HIWORD(wParam) == CBN_SELCHANGE) { int ItemIndex = SendMessage((HWND)lParam, (UINT)CB_GETCURSEL, (WPARAM)0, (LPARAM)0); (TCHAR)SendMessage((HWND)lParam, (UINT)CB_GETLBTEXT, (WPARAM)ItemIndex, (LPARAM)ListItem); if (h = ListCheck(wParam, lParam, ListItem, hPopup, ID, h)) return h; }
Hier übergibst du den falschen Wert als HDC, denn in wParam befindet sich doch jetzt nicht der HDC sondern (wie man an der if-Abfrage sieht) als HIWORD CBN_SELCHANGE. Du mußt das HDC von deinem Control übergeben!
Jede WinAPI-Message hat unterschiedliche Werte in de Parametern 'wParam' und 'lParam' stehen (darum sind diese eben auch so allgemein gehalten). Im einzelnen mußt du dann in der MSDN Doku zu der Message nachschauen!
-
Ja, danke, klingt recht logisch... Aber wie soll ich das denn sonst machen, ich kann den Code ja schlecht in WM_CTLCOLORSTATIC oder ähnliches hineinfetzen
MFG
FERNman
-
FERNman schrieb:
Ist mir durchaus bewusst, aber du beziehst das sicher auf einen Fehler, wo liegt er ?
Beispielsweise hier:
FERNman schrieb:
if (hCtl = Stunde[ID])
Das sollte vermutlich ein Vergleich sein, keine Zuweisung.
-
Nope, muss eine Zuweisung sein, da ein Vergleich hier komplett unsinnig wäre. Ich weiß dass man das auch einfach nacheinander Zeile für Zeile machen kann, aber so sieht der Code übersichtlicher aus.
MFG
FERNman
-
Dann erkläre doch mal in Worten, was die Funktion machen soll.
Oder gehe einfach mal mit dem Debugger Zeile für Zeile durch deinen Code...
-
Also, ich habe einen Stundenplan mit 45 Stunden. Wenn man dann bei einer dieser Stunden auf bearbeiten klickt, dann bemerkt der Computer die ID und ein Popup öffnet sich. In diesem kann man dann Stunde, Lehrer und Raum bearbeiten und, in einer Combobox, die Farbe auswählen. ListCheck ist dafür verantwortlich, herauszufinden, welche Auswahl getroffen wurde, und je nachdem welche, die Richtig Farbe auszuwählen. Die Funktion Färben färbt dann die Drei Labels Fach, Lehrer und Raum mit der Ausgewählten Farbe.
Hoffe ihr kennt euch nun aus,
MFG
FERNman
-
Th69 schrieb:
Oder gehe einfach mal mit dem Debugger Zeile für Zeile durch deinen Code...
Habe ich schon oft gemacht, ich weiß aber nicht was das bringen soll (In meinem Fall)
MFG
FERNman