Скажите, как организовать 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,) , но сообщения(любые!) даже в карту контрола не доходят
Помогите
Здравствуйте, 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>====
Здравствуйте, 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));
Исправил, всё работает