Nochmal Subclassing (Verständnis Problem anhand eines Doku Beispieles)



  • Hallo,
    ich dachte ich habe Subclassing verstanden aber wenn ich das Beispiel in der Doku sehe dann kann ich es nicht nachvollziehen was da geschehn soll:

    // The following code shows how to subclass the edit control and list box
    // controls inside a combo box. It uses WM_CTLCOLOR for subclassing.
    // CSuperComboBox represents the combo box
    HBRUSH CSuperComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
    {
       if (nCtlColor == CTLCOLOR_EDIT)
       {
          //Edit control
          if (m_edit.GetSafeHwnd() == NULL)
             m_edit.SubclassWindow(pWnd->GetSafeHwnd());
       }
       else if (nCtlColor == CTLCOLOR_LISTBOX)
       {
          //ListBox control
          if (m_listbox.GetSafeHwnd() == NULL)
             m_listbox.SubclassWindow(pWnd->GetSafeHwnd());
       }
       HBRUSH hbr = CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
       return hbr;
    }
    
    void CSuperComboBox::OnDestroy()
    {
       //unsubclass edit and list box before destruction
       if (m_edit.GetSafeHwnd() != NULL)
          m_edit.UnsubclassWindow();
       if (m_listbox.GetSafeHwnd() != NULL)
          m_listbox.UnsubclassWindow();
       CComboBox::OnDestroy();
    }
    

    Das verstehe ich nicht:

    1. CSuperComboBox::OnCtlColor wird aufegrufen wenn Combobox gemalt werden soll aber wieso kommt es zur Unterscheidung if (nCtlColor == CTLCOLOR_EDIT) und
    (nCtlColor == CTLCOLOR_LISTBOX). Es wird doch nur von ComboBox ausgelöst. Damit
    müsste nCtlColor immer eindeutig sein d.h. (ComboBox den es nicht gibt), oder?

    2. Angenommen in der CSuperComboBox::OnCtlColor wird sublassing eingeführt (siehe Bsp) wird nach Aufrauf der Fkt. jeder Nachricht an erst an die CSuperComboBox weitergeleitet bevor das eigentliche Control edit control oder list box diese verarbeiten kann?

    3. Wenn jede Nachricht im ComboBox von edit control und list box in der CComboBox verarbeitet wird ,ohne dass die einzelnen Nachrichten in der Ableitungsklasse CSuperComboBox nochmal ersetzt werden, müsste das nicht automatisch zum absturz führen?
    Schlisslich eine Fkt wie WM_KEYDOWN könnte von allen 3 Controls vershchieden verarbeitet werden.



  • Es sind nicht 3 Controls sondern nur zwei die eins sind 🤡
    Die Combobox ist unterteilt in ein Edit-Control u ein Listbox-Control.


  • Mod

    Ansonsten bekommt man die entsprechenden Infos für den Subclass leichter mit GetComboBoxInfo!



  • Ja, das jetzt wird es verständlicher.

    In dem Beispiel wird gezeigt wie die Nachrichten einer ComboBox an separates CEdit und CListBox weitergeleitet werden.
    Ist ja klar ComboBox besteht aus Edit und listbox 🙂

    Danke


Log in to reply