...
h = ::LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_ACCELERATOR1));
...
реакция на нажатие/отпускание клавиш в MFC
Поясните мне как сделать, чтобы программа реагировала на нажатие/
отпускание символьных клавиш клавиатуры.
Например, в диалоговом окне при нажатии символьной клавиши в текстовом окошке(static text вроде) появлялась надпись, а при отпускании - исчезала.
Я делаю так: в ресурсах создаю акселератор. В нем прописываю соответствующие кнопки клавиатуры.
потом создаю функции-обработчики сообщений WM_KEYUP, WM_KEYDOWN. В них пишу if(nChar=тому-то)SetDlgItemText(ID_ ...,"***"); Запускаю прогу, ничего не работает...
1) Добавляешь в класс диалога переменные
HACCEL h; - акселератор
CString str; - переменная для текстового поля CEdit типа value
2) Добавляешь в ресурсах сам ACCELERATOR,его ID (IDR_ACCELERATOR1) и текстовое поле ,ставишь для него в Properties свойство Multiline в true.
3)В ф-ии OnInitDialog пишешь
Код:
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);
}
{
// 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);
}
{
str = "Hello World !!! \r\n Hello World !!! \r\n Hello World !!!";
UpdateData(false);
SetTimer(1,500,0);
}
Получаем в итоге : при нажатии на кнопку акселератора в текстовом поле появляется надпись,при отпускании кнопки надпись исчезает.
Но проблема посложнее. Мне нужно обрабатывать сигнал с нескольких клавиш клавиатуры, а не с одной. Стандартные обработчики событий
(которые обрабатывают сообщения WM_KEYUP, WM_KEYDOWN) подошли бы лучше, т.к. там нет задержки, которая обусловлена работой таймера.
Может, кто знает, как сделать обработку событий и припоять ее к программе.
Да, хочется сказать, что обработку нажатия/отпускания кнопок мыши удалось без проблем сделать...
А с клавой никак..
Цитата: *Baikal*
...
Мне нужно обрабатывать сигнал с нескольких клавиш клавиатуры, а не с одной.
...
Мне нужно обрабатывать сигнал с нескольких клавиш клавиатуры, а не с одной.
...
Это не проблема.Посмотри в ресурсах для акселлератора поле Modifier.Там можно добавить клавиши Alt,Shift,Ctrl или их комбинации.
Плюс твоя основная клавиша , т.е. до 4 клавишь.