Сообщения дочерних контролов
От: Erik_  
Дата: 02.06.05 20:29
Оценка:
Доброго времени суток!

Я только начал изучать WTL и поэтому прошу прощения за столь ламерский вопрос, но тем не менее.
Ситуация следующая: у меня есть диалог с некторыми элементами пользовательского интерфейса на нём. Как научиться обрабатывать сообщения этих элементов управления? Ну, например когда пользователь что-то вводит в edit`е или изменяет состояние у radiobutton`а и т. д.?
Re: Сообщения дочерних контролов
От: glyph  
Дата: 03.06.05 06:21
Оценка:
Здравствуйте, Erik_, Вы писали:

E_>Доброго времени суток!


E_>Я только начал изучать WTL и поэтому прошу прощения за столь ламерский вопрос, но тем не менее.

E_>Ситуация следующая: у меня есть диалог с некторыми элементами пользовательского интерфейса на нём. Как научиться обрабатывать сообщения этих элементов управления? Ну, например когда пользователь что-то вводит в edit`е или изменяет состояние у radiobutton`а и т. д.?
Обработчик WM_NOTIFY или WM_COMMAND. За ними скрывается семейство сообщений, так что надо проконсультироваться с MSDN. Обработка будет вестись в классе диалога.
... << RSDN@Home 1.1.4 beta 3 rev. 193>>
Re: Сообщения дочерних контролов
От: _nn_  
Дата: 03.06.05 07:18
Оценка:
Здравствуйте, Erik_, Вы писали:

E_>Доброго времени суток!


E_>Я только начал изучать WTL и поэтому прошу прощения за столь ламерский вопрос, но тем не менее.

E_>Ситуация следующая: у меня есть диалог с некторыми элементами пользовательского интерфейса на нём. Как научиться обрабатывать сообщения этих элементов управления? Ну, например когда пользователь что-то вводит в edit`е или изменяет состояние у radiobutton`а и т. д.?

Обработать WM_NOTIFY и WM_COMMAND как сказали выше.

Для облегчения добавления обработчиков можно использовать
1. Встроенную систему в студии для добавления обработчиков комманд в диалогах.
2. WTLHelper.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Сообщения дочерних контролов
От: Erik_  
Дата: 03.06.05 11:33
Оценка:
Здравствуйте, glyph, Вы писали:

G> Обработчик WM_NOTIFY или WM_COMMAND. За ними скрывается семейство сообщений, так что надо проконсультироваться с MSDN. Обработка будет вестись в классе диалога.


Привожу кусок карты сообщений диалога, в котором реализована сия идея. Не работает . Я потому и спрашивать стал.

...
BEGIN_MSG_MAP_EX(CNewDialog)
...
NOTIFY_HANDLER_EX(IDC_NAMEEDIT, EN_CHANGE, OnNameChange)
...
END_MSG_MAP()
...

LRESULT OnNameChange(LPNMHDR lpNMHDR)
{
  CEdit wnd = GetDlgItem(IDC_NAMEEDIT);
  int iStrLen = wnd.GetWindowTextLength();
  ...
   UIEnable(IDOK, iStrLen != 0, true);

  return 0;
}


Компиляется ОК. Но OnNameChange ни разу не вызвался.
Re[3]: Сообщения дочерних контролов
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 03.06.05 12:40
Оценка:
Здравствуйте, Erik_, Вы писали:

E_>Привожу кусок карты сообщений диалога, в котором реализована сия идея. Не работает . Я потому и спрашивать стал.


E_>
E_>...
E_>BEGIN_MSG_MAP_EX(CNewDialog)
E_>...
E_>NOTIFY_HANDLER_EX(IDC_NAMEEDIT, EN_CHANGE, OnNameChange)
E_>...
E_>END_MSG_MAP()
E_>...

E_>LRESULT OnNameChange(LPNMHDR lpNMHDR)
E_>{
E_>  CEdit wnd = GetDlgItem(IDC_NAMEEDIT);
E_>  int iStrLen = wnd.GetWindowTextLength();
E_>  ...
E_>   UIEnable(IDOK, iStrLen != 0, true);

E_>  return 0;
E_>}

E_>


E_>Компиляется ОК. Но OnNameChange ни разу не вызвался.


    BEGIN_MSG_MAP(CMainDlg)
      COMMAND_HANDLER(IDC_NAMEEDIT, EN_CHANGE, OnEnChangeNameedit)
   END_MSG_MAP()

   LRESULT OnEnChangeNameedit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/);

LRESULT CMainDlg::OnEnChangeNameedit(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
   // TODO:  If this is a RICHEDIT control, the control will not
   // send this notification unless you override the CAxDialogImpl<CMainDlg>::OnInitDialog()
   // function and call CRichEditCtrl().SetEventMask()
   // with the ENM_CHANGE flag ORed into the mask.

   // TODO:  Add your control notification handler code here
   ATLTRACE("OnEnChangeNameedit()\n");

   return 0;
}


не понятно откуда проблема рабочий код создается парой кликов мышкой в Visual Studio
... << RSDN@Home 1.1.4 beta 7 rev. 458>>
Re[4]: Сообщения дочерних контролов
От: Аноним  
Дата: 03.06.05 15:17
Оценка:
OE>не понятно откуда проблема рабочий код создается парой кликов мышкой в Visual Studio

У вас VS какая? Я на .NET 2003 работаю.
Re[5]: Сообщения дочерних контролов
От: BuHHunyx Беларусь  
Дата: 03.06.05 15:37
Оценка:
Здравствуйте, <Аноним>, Вы писали:

OE>>не понятно откуда проблема рабочий код создается парой кликов мышкой в Visual Studio


А>У вас VS какая? Я на .NET 2003 работаю.


Версия ос в данном случае роли не играет. Ребята из M$ следять за совместимостью. Глянь лучше что за стили стоят у эдитаю
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[5]: Сообщения дочерних контролов
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 03.06.05 15:40
Оценка:
Здравствуйте, <Аноним>, Вы писали:

OE>>не понятно откуда проблема рабочий код создается парой кликов мышкой в Visual Studio


А>У вас VS какая? Я на .NET 2003 работаю.


аналогично. Бросаем на диалог edit, вызываем контекстное меню, из него Properties, правим ID, потом на кнопку с молнией (Control Events), из комбобокса напротив EN_CHANGE выбираем вставку функции обработчика. Компилируем, всё работает.
... << RSDN@Home 1.1.4 beta 7 rev. 458>>
Re[2]: Сообщения дочерних контролов
От: Erik_  
Дата: 04.06.05 06:30
Оценка:
Спасибо большое всем за участие. Разобрался.
Воспользовался тулзой WTLHelper с codeproject.com.

Ещё раз большое всем спасибо
Re[3]: Сообщения дочерних контролов
От: Аноним  
Дата: 06.06.05 05:08
Оценка:
Здравствуйте, Erik_, Вы писали:

E_>Здравствуйте, glyph, Вы писали:


G>> Обработчик WM_NOTIFY или WM_COMMAND. За ними скрывается семейство сообщений, так что надо проконсультироваться с MSDN. Обработка будет вестись в классе диалога.


E_>Привожу кусок карты сообщений диалога, в котором реализована сия идея. Не работает . Я потому и спрашивать стал.


E_>
E_>...
E_>BEGIN_MSG_MAP_EX(CNewDialog)
E_>...
E_>NOTIFY_HANDLER_EX(IDC_NAMEEDIT, EN_CHANGE, OnNameChange)
E_>...
E_>END_MSG_MAP()
E_>...

E_>LRESULT OnNameChange(LPNMHDR lpNMHDR)
E_>{
E_>  CEdit wnd = GetDlgItem(IDC_NAMEEDIT);
E_>  int iStrLen = wnd.GetWindowTextLength();
E_>  ...
E_>   UIEnable(IDOK, iStrLen != 0, true);

E_>  return 0;
E_>}

E_>


E_>Компиляется ОК. Но OnNameChange ни разу не вызвался.

Вместо NOTIFY_HANDLER_EX(IDC_NAMEEDIT, EN_CHANGE, OnNameChange) напишите:
COMMAND_HANDLER(IDC_NAMEEDIT, EN_CHANGE, OnNameChange)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.