Непонятки с BN_CLICKED ?
У меня такой вопрос, в главном окне программы создается несколько контролов (buttons, checkboxes), нужно отловить кликанье по ним. Пытаюсь вылавить это в оконной процедуре через notification message BN_CLICKED для WM_COMMAND. Проблема в том, что при кликах wParam постоянно 0, хотя lParam указывает на нужный контрол. Каким же образом мне отловить BN_CLICKED?
Hi all!
У меня такой вопрос, в главном окне программы создается несколько контролов (buttons, checkboxes), нужно отловить кликанье по ним. Пытаюсь вылавить это в оконной процедуре через notification message BN_CLICKED для WM_COMMAND. Проблема в том, что при кликах wParam постоянно 0, хотя lParam указывает на нужный контрол. Каким же образом мне отловить BN_CLICKED?
так для каждого контрола свой обработчик BN_CLICKED в классе окна создается... Каждому контролу по обработчику... В каждом конкретном обработчике и делай все что надо при кликанье на контрол.
так для каждого контрола свой обработчик BN_CLICKED в классе окна создается... Каждому контролу по обработчику... В каждом конкретном обработчике и делай все что надо при кликанье на контрол.
Да нет, у меня читый API без MFC, т.е. все сообщения проходят через оконную процедуру, где их и отлавливаем, или я чего-то недопонял?
case WM_COMMAND:
switch (LOWORD(wparam)) {
case IDOK:
if (HIWORD(wparam) == BN_CLICKED) {
}
break;
case IDCANCEL:
if(HIWORD(wparam) == BN_CLICKED) {
}
break;
}
break;
...
Если ты правильно пишешь оконную функцию, то у тебя wParam не может быть равным нулю хотя бы потому, что в старшем слове хранится код уведомления BN_CLICKED. Покажи свой код, так трудно что-то сказать.
...Покажи свой код, так трудно что-то сказать.
Вот оконная проц. главного окна:
LRESULT CALLBACK WndProc(HWND wHandle,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg){
...
case WM_COMMAND:
if(HIWORD(wParam)==0){
OnTrayMenuSelect(wHandle,wParam,lParam);
}else
if(HIWORD(wParam)==BN_CLICKED){
OnClick(wHandle,wParam,lParam);
}
break;
В принципе я уже обнаружил в чем проблема, но мне не понятно как ее решить. Дело в том, что в winuser.h BN_CLICKED определена как 0, а мне еще нужно обрабатывать клики в меню, что тоже делается через WM_COMMAND с notification code=0. Либо я чего-то не дополнял, либо что?
Вот оконная проц. главного окна:
LRESULT CALLBACK WndProc(HWND wHandle,UINT msg,WPARAM wParam,LPARAM lParam)
{
switch(msg){
...
case WM_COMMAND:
if(HIWORD(wParam)==0){
OnTrayMenuSelect(wHandle,wParam,lParam);
}else
if(HIWORD(wParam)==BN_CLICKED){
OnClick(wHandle,wParam,lParam);
}
break;
В принципе я уже обнаружил в чем проблема, но мне не понятно как ее решить. Дело в том, что в winuser.h BN_CLICKED определена как 0, а мне еще нужно обрабатывать клики в меню, что тоже делается через WM_COMMAND с notification code=0. Либо я чего-то не дополнял, либо что?
Надо сделать еще одно условие по идентификатору сендера
Надо сделать еще одно условие по идентификатору сендера
И чтоб идентификаторы элементов меню и не совпадали и идентификаторами кнопок.
И чтоб идентификаторы элементов меню и не совпадали и идентификаторами кнопок.
Мда, если это единственный способ, то не совсем понятно чем они там думали создавая api, что у них одна константа отвечает за разные события:(