Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

реакция на нажатие/отпускание клавиш в MFC

22K
03 апреля 2007 года
*Baikal*
13 / / 20.03.2007
Думал, что сам справлюсь... ошибался.
Поясните мне как сделать, чтобы программа реагировала на нажатие/
отпускание символьных клавиш клавиатуры.
Например, в диалоговом окне при нажатии символьной клавиши в текстовом окошке(static text вроде) появлялась надпись, а при отпускании - исчезала.
Я делаю так: в ресурсах создаю акселератор. В нем прописываю соответствующие кнопки клавиатуры.
потом создаю функции-обработчики сообщений WM_KEYUP, WM_KEYDOWN. В них пишу if(nChar=тому-то)SetDlgItemText(ID_ ...,"***"); Запускаю прогу, ничего не работает...
320
03 апреля 2007 года
m_Valery
1.0K / / 08.01.2007
Могу предложить такой способ :
1) Добавляешь в класс диалога переменные
HACCEL h; - акселератор
CString str; - переменная для текстового поля CEdit типа value
2) Добавляешь в ресурсах сам ACCELERATOR,его ID (IDR_ACCELERATOR1) и текстовое поле ,ставишь для него в Properties свойство Multiline в true.
3)В ф-ии OnInitDialog пишешь
 
Код:
...
 h = ::LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
...

4)Добавляешь в класс диалога 2 ф-ии из Messages .Они имеют след.вид
Код:
BOOL CHaccelDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class
    if(pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
        return ::TranslateAccelerator(m_hWnd, h, pMsg);
    return CDialog::PreTranslateMessage(pMsg);
}

void CHaccelDlg::OnTimer(UINT nIDEvent)
{
    // TODO: Add your message handler code here and/or call default
         str = "";
        UpdateData(false);
      CDialog::OnTimer(nIDEvent);
}

5)Добавляешь ф-ию обработчик нажатия самого акселератора(Add Event Handler).Она имеет след.вид
 
Код:
void CHaccelDlg::OnAcc11()
{
    str = "Hello World !!! \r\n Hello World !!! \r\n Hello World !!!";
    UpdateData(false);
    SetTimer(1,500,0);
}

Получаем в итоге : при нажатии на кнопку акселератора в текстовом поле появляется надпись,при отпускании кнопки надпись исчезает.
22K
07 апреля 2007 года
*Baikal*
13 / / 20.03.2007
Все, что вы предложили, получается.
Но проблема посложнее. Мне нужно обрабатывать сигнал с нескольких клавиш клавиатуры, а не с одной. Стандартные обработчики событий
(которые обрабатывают сообщения WM_KEYUP, WM_KEYDOWN) подошли бы лучше, т.к. там нет задержки, которая обусловлена работой таймера.
Может, кто знает, как сделать обработку событий и припоять ее к программе.
Да, хочется сказать, что обработку нажатия/отпускания кнопок мыши удалось без проблем сделать...
А с клавой никак..
320
09 апреля 2007 года
m_Valery
1.0K / / 08.01.2007
Цитата: *Baikal*
...
Мне нужно обрабатывать сигнал с нескольких клавиш клавиатуры, а не с одной.
...


Это не проблема.Посмотри в ресурсах для акселлератора поле Modifier.Там можно добавить клавиши Alt,Shift,Ctrl или их комбинации.
Плюс твоя основная клавиша , т.е. до 4 клавишь.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог