Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > отлов сообщений клавы.


Автор: bilbobagginz 16.2.2007, 20:25
ок. опять проблемз.

есть класс-сын CDialog.
он имеет несколько графических элементов: кнопочек, рюшечек и т.д.
нужно, чтобы кроме мышки программой можно было управлять при помощи клавиатуры.
что я сделал ?

допустим этот класс зовется CMyDlg.

добавил в public:
Код

afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);

реализовал их всех одинаково:
Код

void CMyDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
    AfxMessageBox("Wa Wa Wee Wa, OnKeyDown!!!",MB_OK,0);
}

void CMyDlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
    AfxMessageBox("Wa Wa Wee Wa, OnKeyUp!!!",MB_OK,0);
}
void CMyDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: Add your message handler code here and/or call default
    AfxMessageBox("Wa Wa Wee Wa, OnChar!!!",MB_OK,0);
}


добавил, ессно в MESSAGE_MAP:
Код

    ON_WM_KEYUP()
    ON_WM_KEYDOWN()
    ON_WM_CHAR()


собрал проект, запустил, нажал на клавиатуру, и ничего не поймал. 

что сделано не так ?
как ловить ? 
что прочитать ?


Автор: bilbobagginz 16.2.2007, 21:36
добавления:

запустил Spy++. при нажатии на клавиатуру и отслеживание сообщений диалога получаю, что диалог получает сообщения 

WM_KICKIDLE

часть сообщений получают сами кнопки.

Но я хочу, чтобы не кнопки, а диалог ловили сообщения клавиатуры.
как этого достигнуть ?

Автор: zkv 16.2.2007, 21:59
bilbobagginz, не знаю как сделать стратегически правильно, но вот работающий вариант:
Код

//в хидере
virtual BOOL PreTranslateMessage(MSG* pMsg);
//в реализации
BOOL CTestDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: Add your specialized code here and/or call the base class
    if( WM_KEYDOWN == pMsg->message )
        TRACE( "OnKeyDown" );
    if( WM_KEYUP == pMsg->message )
        TRACE( "OnKeyUp" );
    if( WM_CHAR == pMsg->message )
        TRACE( "OnChar" );

    return CDialog::PreTranslateMessage(pMsg);
}

Автор: Greeen 16.2.2007, 22:38
bilbobagginz, как вариант использование акселераторов

Автор: bilbobagginz 16.2.2007, 22:44
Цитата

но вот работающий вариант:

получил лося!!! smile
Супер. Спасибо огромное!
+1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)