Отражённые сообщения в WTL
От: Yurets Земля  
Дата: 01.05.03 19:01
Оценка:
Скажите, как организовать message reflection в WTL ?

У меня есть диалог, на нём EDIT контрол. Я хочу обрабатывать сообщение WM_CTLCOLOREDIT. В MFC всё легко ... А здесь :/

Вот кусок класса контрола:


class CMyEdit : public CWindowImpl<CMyEdit, CEdit>, public COwnerDraw<CMyEdit>
{
public:
    DECLARE_WND_SUPERCLASS(NULL, CEdit::GetWndClassName())

    BEGIN_MSG_MAP(CMyEdit)
        //MESSAGE_HANDLER(OCM_CTLCOLOREDIT, OnCtlColor)
        MESSAGE_HANDLER(WM_CTLCOLOREDIT, OnCtlColor)
    END_MSG_MAP()

    LRESULT OnCtlColor(UINT uMsg, WPARAM, LPARAM, BOOL& bHandled);

====

Вот карта сообщений в классе дилога:


    BEGIN_MSG_MAP(CMainDlg)
        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
        COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
        COMMAND_ID_HANDLER(IDOK, OnOK)
        COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
        //REFLECT_NOTIFICATIONS()
        CHAIN_MSG_MAP_MEMBER(m_edit)
    END_MSG_MAP()

protected:
    CMyEdit    m_edit;

====

Если оставить всё как есть, то OnCtlColor вызывается и всё казалось бы хорошо, но.. если добавить ещё один едит-контрол, не сабкласенный, простой.. то обрабатывается и его WM_CTLCOLOREDIT

Пытался делать по-правильному — через REFLECT_NOTIFICATIONS() и MESSAGE_HANDLER(OCM_CTLCOLOREDIT,) , но сообщения(любые!) даже в карту контрола не доходят

Помогите
Re: Отражённые сообщения в WTL
От: template  
Дата: 01.05.03 19:21
Оценка: 3 (1)
Здравствуйте, Yurets.
Нужно подправить
Y>
Y>class CMyEdit : public CWindowImpl<CMyEdit, CEdit>, public COwnerDraw<CMyEdit>
Y>{
Y>public:
Y>    DECLARE_WND_SUPERCLASS(NULL, CEdit::GetWndClassName())

Y>    BEGIN_MSG_MAP(CMyEdit)
Y>        MESSAGE_HANDLER(OCM_CTLCOLOREDIT, OnCtlColor) // вот так правильно
Y>        //MESSAGE_HANDLER(WM_CTLCOLOREDIT, OnCtlColor)
Y>    END_MSG_MAP()

Y>    LRESULT OnCtlColor(UINT uMsg, WPARAM, LPARAM, BOOL& bHandled);
Y>

Y>====

Y>Вот карта сообщений в классе дилога:



Y>
Y>    BEGIN_MSG_MAP(CMainDlg)
Y>        MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
Y>        COMMAND_ID_HANDLER(ID_APP_ABOUT, OnAppAbout)
Y>        COMMAND_ID_HANDLER(IDOK, OnOK)
Y>        COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
Y>        REFLECT_NOTIFICATIONS() //необходимо как воздух
Y>        //CHAIN_MSG_MAP_MEMBER(m_edit) // убрать иначе будут посылаться все необработанные сообщения в карту этого члена
Y>    END_MSG_MAP()

Y>protected:
Y>    CMyEdit    m_edit;

    LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
    {
                    ....
        m_edit.SubclassWindow(GetDlgItem(IDC_EDIT1)); // вот чего нехватало !!!!
Y>

Y>====
Re[2]: Отражённые сообщения в WTL
От: Yurets Земля  
Дата: 01.05.03 21:54
Оценка:
Здравствуйте, template, Вы писали:

T>Нужно подправить

[skip]
Y>
Y>protected:
Y>    CMyEdit    m_edit;

T>    LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
T>    {
T>                    ....
T>        m_edit.SubclassWindow(GetDlgItem(IDC_EDIT1)); // вот чего нехватало !!!!



Спасибо !


В OnInitDialog у меня было ....
стыдно сказать

m_edit.Attach(GetDlgItem(IDC_EDIT1));



Исправил, всё работает
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.