Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как получать сообщения от всех контролов?  (Прочитано 14591 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 30-05-2005 09:32 » 

Есть класс CDialog как обработать нажатие на любую кнопку этого диалога или установку фокуса на любой едит фокуса если ID этих контролов зарнее неизвестно
т.е
   ON_BN_CLICKED(IDOK, OnNewDocumentSize)
   ON_EN_SETFOCUS(IDC_EDIT2, OnEnSetfocusEdit2)
   ON_EN_SETFOCUS(IDC_EDIT1, OnEnSetfocusEdit1)
не подходят

Пробовал использовать ON_WM_FOCUS() не работает...

Как можно решить эту проблему? Жаль
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Александр Цикин
Гость
« Ответ #1 : 30-05-2005 09:55 » 

Юзай WM_LBUTTONDOWN собственно диалога, а потом проверяй, есть ли у тебя на этом месте контрол. Хотя гемморойно это.
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #2 : 30-05-2005 10:05 » 

Юзай WM_LBUTTONDOWN собственно диалога, а потом проверяй, есть ли у тебя на этом месте контрол. Хотя гемморойно это.
Юзай WM_LBUTTONDOWN собственно диалога, а потом проверяй, есть ли у тебя на этом месте контрол. Хотя гемморойно это.

Если кнопка нажата на контроле например едите ON_WM_LBUTTON диалога не вызывается
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #3 : 30-05-2005 10:31 » new

Перехватывай сообщения. Там же будет, вроде, идентификатор кому было послано сообщение.
Поставь хук.
Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #4 : 31-05-2005 05:40 » 

Перехватывай сообщения. Там же будет, вроде, идентификатор кому было послано сообщение.
Поставь хук.
А какие сообщения мне перехватывать и где?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #5 : 31-05-2005 06:42 » 

Уже что только не делал и OnNotify переопределял - так не разу и не вызвалось
и так обрабатывать пытался - ON_MESSAGE(WM_NOTIFY,OnNotify) ноль эмоций!!
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #6 : 31-05-2005 06:43 » 

Почему я не получаю события OnNotify!!!  а ON_EN_SETFOCUS(IDC_EDIT1, OnEnSetfocusEdit1) хотя это тот же самый Notify и есть Что за ерунда?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #7 : 31-05-2005 06:44 » 

USBLexus,

Тебе надо переписать функцию PreTranslateMessage. В ней отлавливать BN_CLICKED  и WM_SETFOCUS сообщения:

The BN_CLICKED notification message is sent when the user clicks a button. The parent window of the button receives this notification message through the WM_COMMAND message.

BN_CLICKED
idButton = (int) LOWORD(wParam);    // identifier of button
hwndButton = (HWND) lParam;         // handle to button

При создании кнопок на форме тебе надо будет запоминать в каком-то массиве соответствующие ID и hwnd каждой кнопки. Тогда при сообщении BN_CLICKED ты извлекаешь ID кнопки из wParam.
При сообщении WM_SETFOCUS ты можешь вызвать GetFocus(), которая вернет тебе hwnd окна, имеющего сейчас фокус. Теперь остается пройтись по своему массиву и, зная hwnd кнопок, сравнивать их с тем, который ты получил из GetFocus().
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #8 : 31-05-2005 06:59 » 

Обработал
BOOL CLayerParamsDlg::PreTranslateMessage(MSG* pMsg)
//
//Отлавливаем сообщения
//
{
   if(pMsg->message==WM_NOTIFY){
   int r=5;
   }
return CDialog::PreTranslateMessage(pMsg);//Вызываем базовый класс
}
Почемуто вот это условие:
if(pMsg->message==WM_NOTIFY){
никогда не выполняется
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #9 : 31-05-2005 07:03 » 

Такое ощущение что диалог его игнорирует либо контрол его не посылает
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
xelos
Гость
« Ответ #10 : 31-05-2005 13:58 » 

а свойтсво контрола Notify в true установлено?
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #11 : 01-06-2005 01:48 » 

а свойтсво контрола Notify в true установлено?
Да там вообще нет такого свойства))
В общем вот что я нарыл. Сообщения WM_NOTIFY используют контролы появившиеся после Windows 95 а которые появились до этого - в том числе кнопки и едиты используют WM_COMMAND
Если посмотреть определение тогоже ON_EN_SETFOCUS то можно увидеть что это не что иное как закамуфлированый WM_COMMAND

В общем сделал так:

//----------------------------------------------------------------------------------------------
BOOL CLayerParamsDlg::OnCommand(WPARAM wParam, LPARAM lParam)
//
//Перехват сообщений от контролов
//
{
   WORD Mess=HIWORD(wParam);
    if(Mess!=1)
     if((Mess==EN_SETFOCUS)||(Mess==BN_CLICKED))
      CBalloonTip::Hide(m_Balloon);

return CDialog::OnCommand(wParam, lParam);
}

Функция CBalloonTip::Hide срабатывает при нажатии на любую кнопку в диалоге(BN_CLICKED) и установке фокуса на любой едит(EN_SETFOCUS)
В общем все классно работает)))))))))))))))))
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #12 : 01-06-2005 01:50 » 

Да только проверку if(Mess!=1) надо удалить))) Она там не нужна)
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines