nur Drop-Feld der Drop List verfärbt sich falsch
-
Hi zusammen ich hab unten stehenden Code (OnCtlColor) ist alles prima gewesen, bis ich vorhin ne Droplist eingefügt hab. Das Problem, der Hintergrund der Droplist färbt sich in den gleichen Farben wie in den ersten 2 if-Abfragen! Eigentlich geile Sache aber hier leider nicht erwünscht. Wie kann es sein dass die Droplist geschlossen weiß ist und der Part der runter klappt verfärbt?
muss ich jetzt wirklich das edit getrennt abfangen und BK und TXT-Color setzen? Da hab ich mir doch Käfer eingebaut, oder?// Zeichenroutine; Färbt Hintergrund und Editfelder. HBRUSH CACRSQLView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CRecordView::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd->GetDlgCtrlID() == IDC_EDT_ID && m_pSet->m_ErrCode != 0) {// Wenn Editfeld = ID und es gibt einen Errorcode pDC->SetTextColor(WHITE); pDC->SetBkMode(TRANSPARENT); // Hintergrund transparent machen (also KEIN SetBkColor nötig) HBRUSH B = CreateSolidBrush(RED); //Hintergrundfarbe return (HBRUSH) B; // Die Farbe soll genommen werden } if (pWnd->GetDlgCtrlID() == IDC_EDT_ID && m_pSet->m_ErrCode == 0) {// Wenn Editfeld = ID und es gibt KEINEN Fehlercode pDC->SetBkMode(TRANSPARENT); // Hintergrund transparent machen (also KEIN SetBkColor nötig) HBRUSH B = CreateSolidBrush(GREEN); //Hintergrundfarbe return (HBRUSH) B; // Die Farbe soll genommen werden } switch (nCtlColor) { case CTLCOLOR_STATIC: // Für alle Statics pDC->SetTextColor(BLACK); pDC->SetBkColor(WHITE); case CTLCOLOR_DLG: // Für den Dialog return (HBRUSH)m_brush; } return hbr; }
-
Hat keiner ne Ahnung wie ich den Hintergrund des Drop down wieder weiß bekomm?
Hat das wirklich noch nie jemand gehabt? Dachte das sei ein gängiges Problem.
-
Ich habe keine Lösung, nur einen vagen Ansatz (finde leider den Beitrag nicht mehr).
Eine Combobox besteht aus mehreren Controls.
Ein Edit, ein Button und ein Static oder eine Listbox (da bin ich mir nicht sicher).
Leg mal dein VC und dein Programm so nebeneinander, dass sie sich nicht überdecken.
Setz einen Breakpoint in die OnCtlColor.
Dann starte den Debugger und schau, welche Werte da jeweils für die Controls reinkommen.Hoffentlich kannst du so etwas erkennen.
-
der läuft mir bestimmt 6 mal in die If-Abfrage wo er auf rot stellt
die Abfrage ist doch aber:if (pWnd->GetDlgCtrlID() == IDC_EDT_ID && m_pSet->m_ErrCode != 0)
was ich merkwürdig finde, ist dass ich im Debugger für GetDlgCtrlID() nichts gescheites bekomm. Wie kann das denn überhaupt sein? Ich hab doch in der Abfrage IDC_EDT_ID, da kann der doch dann nicht mit dem dropdown rein. Ich versteh das überhaupt nicht!
Wie bekomm ich denn raus was für ein Control mir da rein läuft und wie kann ich während der Debugphase die CtrlID raus bekommen??
Oh man ich hab immer so fehler!
-
Also, ich habe raus, wie du siehst, ob es das gesuchte Control ist.
CWnd* ptest = GetDlgItem(IDC_DAS_GESUCHTE);
und dann einfach mit pWnd vergleichen. Das kann man auch durch hingucken.
Rebuild All hast du schon gemacht?
-
Rebuild all hab ich natürlich schon gemacht! So gut kenn ich das Visual Studio nun doch schon *gg*
öhm wenn ich dein pTest rein mach und dann add Watch mach dann kann ich es auf so ca 10 Seiten aufblättern und in meinen Augen ist alles was drin steht äußerst kryptisch! Es würde mich echt mal interesseieren wieso das dropdowntarget IDC_EDT_ID annimt!
-
Du sollst nicht 10 Seiten lesen.
Gleich der Hauptwert ist der, den du vergleichen sollst.
Das ist doch beide Male ein Zeiger auf das Control. Wenn die Zeiger identisch sind (also die Adressen gleich), dann hast du das Control am Wickel, was dich interessiert.
-
ich weiß nicht ob ich das richtig verstanden hab aber schau mal bitte hier war das so gemeint?
Hab jetzt mal noch mein IDC_CMB_SEARCH also meine Combo da mit rein gemacht die hat dann noch nen dritten Wert. Und nu? Kannst du mit diesen Infos was anfangen??
-
Lass pTest mal auf IDC_CMB_SEARCH zeigen und dann drück so oft F5, bis die beiden Zeiger gleich sind (oder bau einen bedingten Breakpoint ein).
-
also hiersind jetzt beide IDCs drin.
Ich mach mich jetzt mal auf die suche nach gleichen!
DANKE schon mal
-
jetzt dreh ich denn gleich ganz durch, wenn sie gleich sind springt er über die If abfrage schau dir das mal an:hier
-
Immer?
Sei mal so geduldig und debugge komplett durch. Die Funktion wird SEHR oft aufgerufen.
Und achte darauf, dass sich Programm und Visual C++ NIRGENDWO auch nur ein ganz klein wenig überdecken!!!
So kannst du zugucken und sonst wäre es eine Endlosschleife.
-
in dem moment wo ich die Combo sichtbar mache springt er mir gar nie in die IF
also wennm_edtSearch.ShowWindow(FALSE); m_cmbSearch.ShowWindow(TRUE);
da passiert nichts wenn ich jetzt aber auf den Pfeil drücke zum aufklappen, dann geht er rein!
Da hab ich jetzt mal alle Adressen notiert schau dir mal bitte an ob du da was daraus ableiten kannst, warum und wieso der sowas macht.
-
Wenn die Cbx dran ist geht er nie in die if?
Dann ist die unschuldig und die falsche Farbe müßte auch dann kommen, wenn du sie auskommentierst - stimmt das?
Sorry, so aus der Ferne ist es wirklich schwer.
-
estartu_de schrieb:
Wenn die Cbx dran ist geht er nie in die if?
Ja ich hab auch mal nen Breakpoint gemacht um mich nochmal zu vergewissern ob das wirklich stimmt hab gemacht if pWnd == pTest2 (also die Combo) und das ganze in der If. Ich konnte machen was ich wollte der ist da nie rein gegangen
estartu_de schrieb:
Dann ist die unschuldig und die falsche Farbe müßte auch dann kommen, wenn du sie auskommentierst - stimmt das?
Wen soll ich auskommentieren? Hab die Farbzuweisung auskommentiert dann wird die Combo auch nicht rot. Fakt ist wohl schon wie du gesagt hast dass die Combo aus mehreren Teilen aufgebaut ist, und da ist dann halt auch für jeden Teil eine eigene Speicheradresse. Drum geht "IDC_CMB_SEARCH" da nie rein.
-
Verstehe ich nicht, das widerspricht sich alles.
Also, ich würde versuchen, eine große if um die beiden oberen zu machen und immer wenn es um die Combobox geht wird der Teil übersprungen.
Wenn das immer noch nicht geht bin ich wirklich ratlos.
-
estartu_de schrieb:
... immer wenn es um die Combobox geht wird der Teil übersprungen...
Was soll ich in die große if packen? IDC_CMB... geht ja nicht. Das haben wir ja bereits festgestellt.
-
Haben wir? Ich dachte du hast es nur im Debugger nirgends zum Angucken gefunden.
Also, ohne weitere Umstellungen (eigene Editklasse, die selber die Farbe ändert) weiß ich nix mehr.
-
Also ich getCTRLID() == IDC_CMB.. abgefragt und es war genau das gleiche. Jetzt halte dich fest, jetzt kommt ein Mörder phänomen!!!
Ich hab die Editumfärbung auf ein Einstellungstechnisch gleiches Edit gelegt, und siehe da, die Combo bleibt weiß! Juhu!!
LEIDER NEIN!
das neue Edit aktualisiert nicht richtig lässt wenn es mal aktualisiert rote Ränder stehen ...
Ich hatte gehofft, dass ich vielleicht durch umbenennung weiter komme, aber auch das hilft nichts! Ich geh jetzt nach Hause und morgen überleg ich mir wie ich diesen Bug als Feature verkaufen kann. Wenn ich schon nicht proggen kann dann versuch ich mich halt mal im verkaufen!Wie Sun schon sagte: "It´s not a bug! IT´S A FEATURE!!!!!"
-
Ich habe mir das jetzt nicht alles durchgelesen, habe aber auch schon mal mit farbigen ComboBoxen gekämpft, die sich unter XP anders als unter NT verhalten. Massive Unterschiede beim Färben gab es dabei je nach dem ob die ComboBox auf Dropdown-Listenfeld oder Dropdown eingestellt war. Habe ich damals so versucht (s.u.). Das MemberVariable.Invalidate() hat dabei übrigens gegen den besagten stehengelassenen Rand geholfen.
HBRUSH CFarbigeComboBoxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if((pWnd == &m_CB1) && (m_CB1.IsWindowEnabled()) && (m_CB1.GetWindowTextLength()==0)) { pDC->SetBkColor(RGB(255,0,0)); return b; // CBrush b(RGB(255,0,0)); <- hatte ich damals global angelegt } if((pWnd == &m_CB2) && (m_CB2.IsWindowEnabled()) && (m_CB2.GetWindowTextLength()==0)) { pDC->SetBkColor(RGB(255,0,0)); return b; } // pDC->SetBkColor(RGB(255,0,0)); // färbt die Texte in der ComboboxListe return hbr; } void CFarbigeComboBoxDlg::OnSelchangeCombo1() // Dropdown-Listenfeld { m_CB1.Invalidate(); } void CFarbigeComboBoxDlg::OnSelchangeCombo2() // Dropdown { m_CB2.Invalidate(); }