CComboBox::SetEditSel() bzw. CEdit::SetSel()
-
Guten Morgen,
ich habe ein Problem mit den obengenannten Funktionen. (Eigentlich brauche ich nur eine von beiden, doch beides führt zum selben unerwünschten Ergebnis)
Und zwar habe ich mir eine Klasse von CComboBox abgeleitet, mein Vorhaben ist, einen Eintrag editierbar zu gestalten und die restlichen als Readonly. Zudem werden die Einträge alle farbig dargestellt. (Die Idee hatte ich von Codeproject, konnte ich mit ein wenig Änderungen gut für mein Projekt gebrauchen.)
Mein Problem liegt nun darin, dass es unter Win 2000 hervorragend funktioniert unter Win XP jedoch direkt abstürzt.Ich konnte den Fehler auch auf die Funktion zurückführen, wo das Programm komischerweise hängen bleibt. Naja, eigentlich bleibt es nicht hängen, sondern es bricht in der Funktion ab und springt immer wieder in die OnCtlColor - Nachrichtenbehandlung. Hier ein wenig Quellcode:
HBRUSH CEasyComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { CString strTemp; WriteErrorLog("--Entering OnCtlColor"); CEdit* pEdit = (CEdit*)GetWindow(GW_CHILD); // hier versuche ich es dieses Mal mit CEdit::SetSel() ASSERT(pEdit); pDC->SetBkMode(TRANSPARENT); WriteErrorLog("Set Background to Transparent"); strTemp.Format("GetCurSel: %d", GetCurSel()); WriteErrorLog(strTemp); if (GetCurSel() != 0) { WriteErrorLog("Entering SetEditSel"); pEdit->SetSel(-1,0); // auch wenn ich SetEditSel() versuche, gleiches Ergebnis WriteErrorLog("Leaving SetEditSel"); } if (GetCurSel() == 0 || GetCurSel() == CB_ERR) { WriteErrorLog("--Leaving OnCtlColor: BrushEdit\n"); return m_cBkBrushEdit; } else { WriteErrorLog("--Leaving OnCtlColor: BrushRead\n"); return m_cBkBrushRead; } }Sobald ich auf das Element 1 wechsel (GetCurSel() = 1), dann hängt das Programm in OnCtlColor. Hier der Auschnitt aus der ErrorLog, wenn ich es unter Win XP laufen lasse:
--Entering OnCtlColor
Set Background to Transparent
GetCurSel: 1
Entering SetEditSel
--Entering OnCtlColor
Set Background to Transparent
GetCurSel: 1
Entering SetEditSel
--Entering OnCtlColor
Set Background to Transparent
GetCurSel: 1
Entering SetEditSel
....
usw.
...Unter Win 2000 sieht das so aus:
--Entering OnCtlColor
Set Background to Transparent
GetCurSel: 1
Entering SetEditSel
--Entering OnCtlColor
Set Background to Transparent
GetCurSel: 1
Entering SetEditSel
Leaving SetEditSel
--Leaving OnCtlColor: BrushReadLeaving SetEditSel
--Leaving OnCtlColor: BrushReadHier sieht man, dass das Programm letztendlich in die OnCtlColor zurückspringt.
Hoffe, das ist verständlich. Sonst fragt einfach.
Ich möchte ja bloß, dass, wenn ich die Readonly Einträge auswähle, die Markierung löschen, indem ich die Selection aufhebe.Danke.
MfG,
Paul.
-
Keiner ne Idee, was unter XP anders läuft?
-
Ich könnte mir höchstens vorstellen, daß der SetSel()-Aufruf wieder den Repaint-Mechanismus aufruft - der wird dann etwas tiefer wieder OnCtlColor um Hilfe bitten, womit du anscheinend in einer Endlosrekursion festsitzt.
-
Ja, anscheinend. Aber warum? Warum funktioniert das denn auch unter Win2000?
Das MSDN sagt nix dazu?!
-
Paul_C. schrieb:
Warum funktioniert das denn auch unter Win2000?
Glück? Andere Verarbeitung? (auch die Win2000-Version geht anscheinend in eine Rekursion, aber bricht in der nächsten Stufe ab - vermutlich weil SetSel() nichts macht, wenn die Selektion bereits "stimmt")
Als Lösung könnte ich mir höchstens vorstellen, daß du diese Kontrolle aus der OnCtlColor()-Bearbeitung rausnimmst. Passender wäre es imho, direkt die WM_SETSEL-Ereignisse der Combobox bzw. ihres Editfeldes abzufangen.
-
Werde ich mal schauen. Wäre wohl die Beste Idee.
...
P.S.: Der bietet mir keine WM_SETSEL oder dergleichen an. Auch nicht bei den virtuellen Funktionen?!?
-
Habe mal selber in die Messagemap eine Behandlung für CB_SETEDITSEL eingefügt.
Darauf reagiert er aber überhaupt nicht.Als Notlösung mache ich das nun so, dass ich nach der Windowsversion schaue und für Win2000 es nun zulasse, für die anderen nicht.