Id-Vergabe und Event-Handler
-
Hi,
Ich erstelle meine ComboBoxen dynamisch und bin auf ein Problem gestoßen.
Ich habe ein Problem, damit meine dynamisch erstellten ComboBoxen einem Envent-Handler (OnSelChange)
hinzu zu fügen.Bei Buttons gehe ich einfach wie folgt vor:
ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON25, &CContainer::OnClickedDButton)
Wie kann ich das für ComboBoxen machen? Über eine Membervariable, die ich automatisch inkrementiere
geht das ja nicht, weil die Messages in keiner Methode hinzugefügt werden. Folgender Code funktioniert
auch nicht.ON_CONTROL_RANGE(CB_SETCURSEL, IDC_COMBO1, IDC_COMBO25, &CContainer::OnCbnSelchangeCombo)
Momentan habe ich das so gelöst, dass ich jeder ComboBox die gleiche ID gegeben habe und dann einen
ganz normalen Event-Handler erstellt. Das funktioniert zwar, aber ich weiss nicht ob das guter Programmierstil
ist oder evtl. später zu Problemen führen kann.Lg und Danke
Kerberos
-
Überschreibe doch in Deiner Dialogklasse CWnd::OnCommand
http://msdn.microsoft.com/en-us/library/aa249866(VS.60).aspxDann kanst Du selber behandeln was Du willst. OnCommand wird aktiviert bevor irgend eine Message-Map mit Handlern aktiv wird.
Weiterhin kannst Du mit AfxGetMessage Dir die original WM_COMMAND Nachricht besorgen. Außerdem gibt es ON_COMMAND_EX!
-
Hi Martin,
Die Funktion AfxGetMessage kennt mein Compiler nicht und google findet dazu nur ein oder zwei Seiten.
OnCommand ist ein sehr guter Tipp, ich wusste nicht dass es solch eine Methode gibt. Leider habe ich ein Problem
damit:Ich habe in der Resource.h zwei Makros definiert:
IDC_COMBO_START 2000
IDC_COMBO_END 2020dann müsste der Code doch wie folgt in der OnCommand aussehen, um die Nachrichten der ComboBox abzufangen
if(wParam >= IDC_COMBO_START && wParam <= IDC_COMBO_END)
{
...
}Das funktioniert aber nicht mit einer ComboBox. Ich habe das gleiche mit einem Button getestet und da funktioniert
es einwandfrei.Des Weiteren habe ich ja noch das Problem, dass mit dem o. g. jede Nachricht der ComboBox abgefangen werden würde
und nicht nur wenn sich das aktuell gewählte Element ändert.Lg und Danke
Kerberos
-
1. Ich meinte AfxGetCurrentMessage! Sorry.
2. Lies bitte die Doku zu WM_COMMAND. Die ID steht nur im LOWORD im HIWORD steht der Notification Code.
http://msdn.microsoft.com/en-us/library/ms647591(VS.85).aspx
-
Du bist der Beste, Martin!
Jetzt klappt es. Nur weiss ich nicht genau wieo :D, bzw. ich hab das
Resultat (8) durch das Debuggen rausbekommen:int iId = LOWORD(wParam); int iNodifcation = HIWORD(wParam); if(iId >= IDC_COMBO_START && iId <= IDC_COMBO_END) { if(iNodification == 8) { AfxMessageBox(_T("test")); } }Funktioniert tadellos, auch wenn ich nicht genau weiss warum ich die "8" einsetzen muss?
Lg
Kerberos
-
kerberos schrieb:
Du bist der Beste, Martin!
Ich bin gut, aber nicht der Beste!

Jetzt klappt es. Nur weiss ich nicht genau wieo :D, bzw. ich hab das
Resultat (8) durch das Debuggen rausbekommen:int iId = LOWORD(wParam); int iNodifcation = HIWORD(wParam); if(iId >= IDC_COMBO_START && iId <= IDC_COMBO_END) { if(iNodification == 8) { AfxMessageBox(_T("test")); } }Funktioniert tadellos, auch wenn ich nicht genau weiss warum ich die "8" einsetzen muss?
Indem Du Dir klar wirst was eigentlich WM_COMMAND nachrichten sind. Auszug aus WINUSER.H
#define CBN_SELCHANGE 1 #define CBN_DBLCLK 2 #define CBN_SETFOCUS 3 #define CBN_KILLFOCUS 4 #define CBN_EDITCHANGE 5 #define CBN_EDITUPDATE 6 #define CBN_DROPDOWN 7 #define CBN_CLOSEUP 8 #define CBN_SELENDOK 9 #define CBN_SELENDCANCEL 108==CBN_CLOSEUP
-
Ok,
nochmals vielen Dank!
Ich dachte die WM_COMMAND-Nachrichten enthalten im HIWORD die Markos die mit CB_... beginnen (z. B. CB_SETCURSEL) und nicht die CBN_....
-
Nein! Alle WM_COMMAND Notifications haben ein N vor dem Unterstrich. EN_... LBN_... CBN_... etc.
Achtung diese Werte sind nicht eindeutig!
-
Ok, vielen Dank!
Lg Kerberos