Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сообщение WM_KEYUP, Обработка диалоговым окном 
:(
    Опции темы
Nastya
Дата 4.2.2003, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Такая ситуация. Пустое диалоговое окно. Обрабатываю сообщенеи WM_KEYUP, WM_KEYDOWN. Все хорошо. Стоит поставить на него или статик или кнопку(любой элемент) и сообщение уже "достается" тому элементу и до самого окна не доходит. Что желать.
А если элементов на окне не один.



--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
Baa
Дата 5.2.2003, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

Репутация: 8
Всего: 12



легким движением руки этого порешить не получилось (в виду не особо хорошего знания MFC)
Возможные варианты решения:
Если делать прогу без MFC, то там все просто...
Можно использовать DirectInput.
з.ы. грамотные люди, я бы тож очень хотел знать ответ на этот вопрос smile.gif


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Guest_Paradox
Дата 5.2.2003, 00:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Дело в том что как только появляется на форме некоторый визуальный компонент Windows передает фокус ему и все сообщения начинает получать этот компонент и соответственно обрабатывать их своими обработчиками по умолчанию. Надо просто убрать с него фокус ввода, если интересно отвечу подробнее...
  Вверх
Vaulter
Дата 5.2.2003, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: 2
Всего: 22



создай кнопку со стилем PARENTNOTIFY что то типа того. тогда сообщения от контрола будут идти в окно в форме WM_NOTIFY сообщения. но от самого окна также должно все идти как и раньше


--------------------
PM MAIL WWW ICQ   Вверх
Nastya
Дата 5.2.2003, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 5
Всего: 44



Цитата
Надо просто убрать с него фокус ввода, если интересно отвечу подробнее...


Надо...
Спасибо...


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
HexoGen(i)us
Дата 9.2.2003, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 9.2.2003

Репутация: нет
Всего: нет



Одна из возможных проблем: для того что бы убрать фокус ввода с компонента на окне как мне кажется само окно должно иметь возможность получить этот фокус... для этого окно нужно создавать со стилем WS_TABSTOP
второе что нам нужно это сделать так что бы если кнопка по каким либо причинам получила фокус то чтобы она его тут же отдавала (типа не тронь бяку)
Для этого мы можем задать ей стиль BS_NOTIFY и она будет пересылать все свои нотификационные сообщения родительскому окну...

А вот сами сообщения
#define BN_CLICKED 0
#define BN_PAINT 1
#define BN_HILITE 2
#define BN_UNHILITE 3
#define BN_DISABLE 4
#define BN_DOUBLECLICKED 5
#if(WINVER >= 0x0400)
#define BN_PUSHED BN_HILITE
#define BN_UNPUSHED BN_UNHILITE
#define BN_DBLCLK BN_DOUBLECLICKED
#define BN_SETFOCUS 6
#define BN_KILLFOCUS 7
#endif /* WINVER >= 0x0400 */

Вобщем я так понимаю тебе нужно отлавливать нотификационное сообщение BN_SETFOCUS (возможно и сообщение при нажатии WM_COMMAND)
и передавать фокус своему окну SetFocus(HandleMyWindow);

Извини если все это не сработает... если честно я не знаю как правильно работать с сообщениями хотя и приходится их постоянно использовать...
я все это опробывал в билдере а в нем сообщения перехватываются как я понимаю не так как в VC++
если не получится пиши smile.gif поставлю себе VC++ и будем думать вместе...

PM MAIL   Вверх
Chegal
Дата 26.2.2005, 08:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Может уже не актуально, но вдруг кому-то понадобится (сам искал все утро):
для обработки ЛЮБЫХ сообщений до того как они будут переданы соответствующим дочерним окнам
используем в MFC - BOOL PreTranslateMessage(MSG* pMsg) т.е. CTRL+w ->Messages->PreTranslateMessage
(можно и вручную), после чего для обработки, например, клавиатуры вставляем код:

BOOL CCommanderDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if (pMsg->message==WM_KEYDOWN && pMsg->wParam== VK_DOWN) {
AfxMessageBox("Нажата клавиша вниз!");
}
return CDialog::PreTranslateMessage(pMsg);
}


  Вверх
Гость_ghost
Дата 16.6.2005, 01:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











не с++, все на API.

есть диалог, на нем два десятка EditBox и две кнопки

в главном цикле диалога ловлю любые изменения в любом EditBox которые EditBox видимо посылает сам (типа я изменился)
проблема.
не могу отловить WM_KEYDOWN для служебных клавиш (Insert/Home/End)

Могу конечно создать личный обработчик для каждого EditBox, но как то уж очень грамоздко.
у кого какие идеи ??
smile

  Вверх
chaos
Дата 16.6.2005, 06:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Цитата
не могу отловить WM_KEYDOWN для служебных клавиш (Insert/Home/End)


а по моему для этого WM_SYSKEYDOWN нужен

Это сообщение отредактировал(а) chaos - 16.6.2005, 06:11
PM WWW   Вверх
Гость_ghost
Дата 16.6.2005, 17:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











WM_SYSKEYDOWN ловит Shift/Ctrl/Alt ;(
  Вверх
Earnest
Дата 17.6.2005, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата
Могу конечно создать личный обработчик для каждого EditBox, но как то уж очень грамоздко.
у кого какие идеи ??


1) Обработчик может быть один -> новая WindowProc -> класс для всех ваших edit'ов.
2) По-моему Hook, повешенный на окно, должен ловить сообщения детям/от детей, но точно не помню...


--------------------
...
PM   Вверх
Fantasist
Дата 18.6.2005, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй
***


Профиль
Группа: Участник Клуба
Сообщений: 1517
Регистрация: 24.3.2002

Репутация: 4
Всего: 41



Цитата(Earnest @ 17.6.2005, 17:23)
2) По-моему Hook, повешенный на окно, должен ловить сообщения детям/от детей, но точно не помню...


О каких Нооках идет речь? Если те, что SetWindwsHookEx - так они вешаются только на поток/процесс.

А так просто своя WindowProc обычно выручает.




--------------------
Волны гасят ветер...
PM MAIL   Вверх
Earnest
Дата 20.6.2005, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Да, SetWindowsHookEx, WH_KEYBOARD, можно повесить на поток, которому принадлежит окно и ловить весь клавиатурный ввод. Хотя в hook-процедуру окно не передается, но узнать, кто сейчас в фокусе, не проблема.
Но не могу не согласиться, что для данной задачи проще и естественнее своя WindowProc.


--------------------
...
PM   Вверх
Guest
Дата 20.6.2005, 19:24 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











>>для данной задачи проще и естественнее своя WindowProc.

Куда уже проще

Код

BOOL CALLBACK cogoDlgProc( HWND dialog, UINT message, WPARAM wParam, LPARAM lParam )
{

switch ( message )
{
  case WM_INITDIALOG :
    initialize_dialog( dialog ) ;
    return TRUE ;
  case WM_COMMAND :    
    do_Command( dialog, message, wParam, lParam ) ; 
    return TRUE;
  case WM_CLOSE :
    close_Dialog( dialog ) ; 
    return TRUE ;
  default :
    return FALSE ;
}
}


Только case WM_COMMAND на нажатие клавиш Home/End не реагирует
Пришлось создать новую EditBoxProc v case WM_INITDIALOG :

SetWindowLong( GetDlgItem( dialog, NUM_0 ),GWL_WNDPROC, (LONG) EditBoxProc ) ;

а потом в EditBoxProc ловить WM_KEYDOWN


Все же попробую SetWindowsHookEx, может получится

  Вверх
Earnest
Дата 20.6.2005, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата
Только case WM_COMMAND на нажатие клавиш Home/End не реагирует

Естественно, это не WM_COMMAND, а WM_KEYDOWN, причем приходящие одному из дочерних окон.

Цитата
Пришлось создать новую EditBoxProc v case WM_INITDIALOG :

Собственно, именно это и имелось в виду.


--------------------
...
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0556 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.