MFC + Accelerator
Прошу помочь с такой "проблемой":
Каким образом подключить Accelerator для класса CDialog.
Заранее спасибо.
Доброго времени суток господа эксперты и им сочувствующие.
Прошу помочь с такой "проблемой":
Каким образом подключить Accelerator для класса CDialog.
Заранее спасибо.
По моему такое сделать невозможно тк таблица акселераторов отправляет сообщение главному окну.
Каким образом подключить Accelerator для класса CDialog.
Никаким. Сообщения диалога не попадают в основной цикл обработки сообщений. Стандартным способом управления диалогом с клавиатуры является добавление префикса "&" к соответствующим статическим текстам.
Если же по каким-то причинам это не подходит, тогда ловите WM_KEYDOWN. И не забудьте при этом про WM_GETDLGCODE (или OnGetDlgCode(), если в MFC). Но проблем с этим будет достаточно.
Никаким. Сообщения диалога не попадают в основной цикл обработки сообщений. Стандартным способом управления диалогом с клавиатуры является добавление префикса "&" к соответствующим статическим текстам.
Если же по каким-то причинам это не подходит, тогда ловите WM_KEYDOWN. И не забудьте при этом про WM_GETDLGCODE (или OnGetDlgCode(), если в MFC). Но проблем с этим будет достаточно.
А что нельзя сообщения акселлераторов перенаправлять в нужное окно-потомок ?
У меня есть код где диалоговое окно получает сообщения от акселератора, правда оно же есть и главным окном. Но я думаю эта проблема легко решается функцией SendMessage( hTargetWnd, ... ).
А что нельзя сообщения акселлераторов перенаправлять в нужное окно-потомок ?
У меня есть код где диалоговое окно получает сообщения от акселератора, правда оно же есть и главным окном. Но я думаю эта проблема легко решается функцией SendMessage( hTargetWnd, ... ).
Попробуйте, может быть, получится.
Дело в том, что MFC вызывает TranslateAccelarator в основном цикле обработки сообщений, а диалог организует свой цикл, в котором акселераторы не используются. Вероятно, можно вызвать TranslateAccelarator и в цикле обработки сообщений диалога, но только боюсь, вам придётся переписать для этого половину MFC.
А почему не подходит обычный диалоговый интерфейс? Помечаете кнопку текстом "&Some command" и используете Alt+s для её нажатия. А кнопку задвигаете за границы окна, и создаётся полное впечатление, что команда выполняется "просто так". Единственное ограничение тут то, что нельзя сделать команду Ctrl+s, а можно только Alt+s. Но для пользователя это должно быть без разницы, мне кажется.
У меня есть код где диалоговое окно получает сообщения от акселератора, правда оно же есть и главным окном. Но я думаю эта проблема легко решается функцией SendMessage( hTargetWnd, ... ).
А нельзя ли этот код посмотреть как нить для повышения образованности а то я пробовал под MFC такое сделать но нифига не вышло тк главное диалоговое окно ничем не отличается от обычного модального диалогового окна просто после завершения работы с этим окном закрывается и приложение.
А нельзя ли этот код посмотреть как нить для повышения образованности а то я пробовал под MFC такое сделать но нифига не вышло тк главное диалоговое окно ничем не отличается от обычного модального диалогового окна просто после завершения работы с этим окном закрывается и приложение.
Назовем наше приложение MyApp.
1. добавляем в объявление класса CMyApp переменную HACCEL hAccel.
2. В функции CMyApp::InitInstance() добавляем следующую строчку :
3. Перегружаем метод СMyApp::PreTranslateMessage.
{
return TranslateAccelerator( m_pMainWnd->m_hWnd, hAccel, pMsg );
}
в таком плане у меня все работает, при немодальном диалоговом окне.
...ничем не отличается от обычного модального диалогового окна просто после завершения работы с этим окном закрывается и приложение.
Утверждение неправильное. В професионально написанных приложениях после закрытия окна еще выполняется разная работа, например очистка ресурсов.
Попробуйте, может быть, получится.
Мне пробовать нечего, у меня все работает.
Дело в том, что MFC вызывает TranslateAccelarator в основном цикле обработки сообщений, а диалог организует свой цикл, в котором акселераторы не используются. Вероятно, можно вызвать TranslateAccelarator и в цикле обработки сообщений диалога, но только боюсь, вам придётся переписать для этого половину MFC.
Лень мне ковыряться в исходниках MFC, проверять действительно ли это так ( хороший практический пример когда понадобилось посмотреть код функции но хрен поймешь где он находится. Comments must die ). И потом это верно не во всех случаях. В частности у меня НеМодальное диалоговое окно получает сообщения из основного цикла.
(rar, 32 kb)
(комментарии, думаю, не нужны, там строчек 4-6)
см также:
http://support.microsoft.com/default.aspx?scid=kb;en-us;222829
http://support.microsoft.com/default.aspx?scid=kb;en-us;100770
Кстати, если говорить о MFC, то там модальные диалоги не водятся (см где-нибудь там же)
P.S.:
В примере способ, описанный PitxBull (src+екзешник), c главным диалогом и "не главным",
оба вызываются DoModal(), т.е. в смысле MFC "модальные" (хотя не модальные в смысле Windows).
В Windows (не MFC!) действительно проблематично
добраться до message loop модального диалога,
которая создается системой
(слышал, что есть какие-то "неочевидные" способы,
но ничего о них не знаю).