Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » OnChildNotify - wie bekommt man den Notification Code

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.11.2005, 09:03 Uhr
~blablalba
Gast


Hallo,

in einem Artikel von Paul DiLascia steht, wie man prinzipiell Verhalten von Dialogelementen dort (und nicht im Dialog) behandeln kann. Die folgende MEthode ist der Schlüssel dazu. Es ist eine eigene ComboBox-klasse, die aus der MFC-Combobox-klasse ableitet und dort OnChildNotify() überschreibt. Leider hat der gute Mann den Teil nicht hingeschrieben, wie man nCode ermittelt...weiß jemand, was er damit meint??? und wie man das implementiert???
Er will hier die Nachricht CBN_DROPDOWN filtern...

Anbei die Methode:
BOOL CMamboCombo::OnChildNotify(UINT msg, WPARAM wp, LPARAM lp,LRESULT* pResult)
{
if (msg= =WM_COMMAND) {
int nCode = // extract notification code, depends
// on Win version
if (nCode= =CBN_DROPDOWN) {
// fill combo box
return FALSE; // Pass to parent dialog
}
}
return CComboBox::OnChildNotify(msg, wp, lp, pResult);
}


BESTEN DANK!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.11.2005, 09:38 Uhr
Spacelord
Hoffnungsloser Fall


Der Code ist das höherwertige WORD von dem WPARAM Argument.
Da kommst du mit dem Makro HIWORD(wp) dran.
Insgesamt sieht das ganze dann etwa so aus :

C++:
BOOL CMamboCombo::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult)
{
    if (message ==WM_COMMAND) {
       int nCode = HIWORD(wParam);  
       if (nCode == CBN_DROPDOWN) {
          AfxMessageBox("Dropdown Nachricht in ComboBox verarbeitet!");
          return FALSE;  
       }
       if (nCode == CBN_EDITCHANGE){
            AfxMessageBox("Text wurde geändert. ");
          return FALSE;  
       }
     //usw......
    }
    
    return CComboBox::OnChildNotify(message, wParam, lParam, pLResult);
}




PS:Ich gehe mal davon aus dass du auch der Ersteller des Threads "Frage zur SoftwareArchitektur, die durch MFC entsteht " bist.
Es wäre schön wenn du dich auf einen Nick festlegen würdest damit man weiß wer du bist.
Oder du registrierst dich halt.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.11.2005, 10:08 Uhr
~maxpower24
Gast


Hi,

besten Dank für deine Antwort(en) - sie haben mir sehr geholfen. Ich werd mich auf den einen nick festlegen...;-)...kann mich im moment nicht registrieren, weil ich im firmennetz hänge und nich an meine privatemails komme...;-(...

Der Link zu dem Artikel war sehr gut, aber trotzdem bleiben da noch einige Fragen....wie kann man denn ein Listenerkonzept mit MVC implementieren, wenn man als Ausgangsbasis eine Dialogorientierte Anwendung erstellt hat??...Dann wird ja standardmäßig nicht die View/Document-Architektur erstellt...

Ich meine, was ich bis jetzt hinbekommen hab, ist, das z.b. eine in einem Dialog untergebrachte ComboBox ihre eigenen Nachrichten behandeln kann (das ist ja das Codefragment, dass du mir geschickt hast)...Trotzdem ist ja aber die abgeleitete Combo-klasse immer noch eine GUI-Klasse und sollte meiner Auffassung nach NICHTs enthalten, was das Verhalten oder gar die Daten der Anwendung beeinflußt....

***
Wäre es vielleicht eine gute Idee, dass man der abgeleiteten Combo-Klasse eine Instanz einer (selbstgeschriebenen Controllerklasse) gibt, an welche man dann die Bearbeitung der Ereignisse weiterdelegiert?? ==>das scheint mir machbar...trotzdem, wäre dann in der abgeleiteten GUI-Klasse noch folgender Pseudo-Code drin...

MyCombo : CCombo{
Controller myGUIController;

MyCombo::OnChildNotify(){
wenn CBN_DropDown leite weiter an Controller.dropDown()
wenn CBN_BLABLA leiter Controller.blabla()
}
}

..auch das scheint mir noch nicht der Stein der Weisen zu sein...irgendwie müßte man es schaffen, dass das aus der GUI-Klasse verschwindet....aber wie??..;-))....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.11.2005, 10:23 Uhr
Spacelord
Hoffnungsloser Fall


Kennst du das Observer Pattern?
Damit könntest du dir was zusammenbasteln wo du keine konkreten Typen in der Dialogklasse erwähnen müsstest.
Das Pattern ist ja unterm Strich die Basis des Listener Konzepts.
Musst du aber alles selbst schreiben.
Die Vorstellungen von Microsoft wie die MFC zu nutzen sind,sind schon ziemlich konkret und andere (zweifelsohne bessere) Wege muss man sich durch,doch nicht unerheblichen Mehraufwand, erarbeiten.
Die Frage ,bei jedem MFC Projekt, ist ob sich dieser Aufwand langfristig wirklich lohnt!?

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
22.11.2005, 10:48 Uhr
~maxpower24
Gast


Hi,

ja, ich kenne das PAttern und habe da auch an sowas gedacht....das problem ist doch nur, dass man es doch irgendwann im Listener doch wieder auf die Windows-Message-codes runterbrechen muß, oder???

Gegenwärtig probiere ich grad folgenden Ansatz: (ich glaube, es geht in die richtige Richtung, auch wenn es noch nicht das Observerpattern ist...)

Ich habe ne eigene Dialogklasse von CDialog abgeleitet, die eine Membervariable vom Typ eines Controllers (diesen habe ich von CCmdTarget abgeleitet) hat. In dieser abgeleiteten Dialogklasse überschreibe ich OnMsgCMD() sodass die Bearbeitung zunächst an die OnMsgCmd()-Methode des Controllers delegiert wird...

...die Frage ist jetzt, was schreibe ich in diese Methode Controller::OnMsgCmd()??? Da muß doch jetzt sowas kommen, wie
if (Nachricht == WM_CBNDROPDOWN){
mache was
} else if (Nachricht == WM_BlaBla) {
mache was anderes
}

oder???

Nebenbei gefragt...wie komme ich dort an diesen MessageCode ran?? Die Signatur hat die Form: OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
....mir ist im Moment noch ein bissl unklar, für was die ganzen Parameter gut sein sollen....;-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
22.11.2005, 11:44 Uhr
Spacelord
Hoffnungsloser Fall


Jetzt willst du es aber wissen was?
Also da müsste ich mich jetzt auch erstmal wieder reindenken aber in etwa sollte dabei folgendes rauskommen:

Im Dialog die Nachricht an den Contrtoller weiterleiten:

C++:
BOOL CNotifyDlg::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
    if(! controller->OnCmdMsg(nID,nCode,pExtra,pHandlerInfo))
        return CDialog::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
    else
        return TRUE;
}




Im Controller die Nachricht abfangen:

C++:
BOOL CController::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
    if(nCode==CBN_DROPDOWN)
    {
        if(nID==IDC_COMBO2)
        {
            AfxMessageBox("Nachricht vom Controller abgefangen!");
            return TRUE;
        }        
    }

    return CCmdTarget::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}


Wobei ich dafür jetzt keine Gewähr übernehme .
Insbesondere müsste man sich im Einzelfall nochmal genau anschauen wann man TRUE oder FALSE zurückgibt weil die Controls ja trotz allem "ihren" Code ausführen müssen.
Da müsste ich selber nochmal in den besagten Artikel niggeln .

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.

Dieser Post wurde am 22.11.2005 um 11:44 Uhr von Spacelord editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: