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

Ваш аккаунт

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

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

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

MFC + Accelerator

7.6K
12 апреля 2005 года
intro
22 / / 12.04.2005
Доброго времени суток господа эксперты и им сочувствующие.

Прошу помочь с такой "проблемой":
Каким образом подключить Accelerator для класса CDialog.

Заранее спасибо.
4.9K
13 апреля 2005 года
CyberMan
55 / / 25.01.2005
Цитата:
Originally posted by intro
Доброго времени суток господа эксперты и им сочувствующие.

Прошу помочь с такой "проблемой":
Каким образом подключить Accelerator для класса CDialog.

Заранее спасибо.


По моему такое сделать невозможно тк таблица акселераторов отправляет сообщение главному окну.

425
13 апреля 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by intro
Каким образом подключить Accelerator для класса CDialog.


Никаким. Сообщения диалога не попадают в основной цикл обработки сообщений. Стандартным способом управления диалогом с клавиатуры является добавление префикса "&" к соответствующим статическим текстам.

Если же по каким-то причинам это не подходит, тогда ловите WM_KEYDOWN. И не забудьте при этом про WM_GETDLGCODE (или OnGetDlgCode(), если в MFC). Но проблем с этим будет достаточно.

351
14 апреля 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by sq_deep
Никаким. Сообщения диалога не попадают в основной цикл обработки сообщений. Стандартным способом управления диалогом с клавиатуры является добавление префикса "&" к соответствующим статическим текстам.

Если же по каким-то причинам это не подходит, тогда ловите WM_KEYDOWN. И не забудьте при этом про WM_GETDLGCODE (или OnGetDlgCode(), если в MFC). Но проблем с этим будет достаточно.



А что нельзя сообщения акселлераторов перенаправлять в нужное окно-потомок ?
У меня есть код где диалоговое окно получает сообщения от акселератора, правда оно же есть и главным окном. Но я думаю эта проблема легко решается функцией SendMessage( hTargetWnd, ... ).

425
15 апреля 2005 года
sq_deep
498 / / 18.02.2005
Цитата:
Originally posted by PitxBull
А что нельзя сообщения акселлераторов перенаправлять в нужное окно-потомок ?
У меня есть код где диалоговое окно получает сообщения от акселератора, правда оно же есть и главным окном. Но я думаю эта проблема легко решается функцией SendMessage( hTargetWnd, ... ).


Попробуйте, может быть, получится.

Дело в том, что MFC вызывает TranslateAccelarator в основном цикле обработки сообщений, а диалог организует свой цикл, в котором акселераторы не используются. Вероятно, можно вызвать TranslateAccelarator и в цикле обработки сообщений диалога, но только боюсь, вам придётся переписать для этого половину MFC.

А почему не подходит обычный диалоговый интерфейс? Помечаете кнопку текстом "&Some command" и используете Alt+s для её нажатия. А кнопку задвигаете за границы окна, и создаётся полное впечатление, что команда выполняется "просто так". Единственное ограничение тут то, что нельзя сделать команду Ctrl+s, а можно только Alt+s. Но для пользователя это должно быть без разницы, мне кажется.

4.9K
15 апреля 2005 года
CyberMan
55 / / 25.01.2005
Цитата:
Originally posted by PitxBull
У меня есть код где диалоговое окно получает сообщения от акселератора, правда оно же есть и главным окном. Но я думаю эта проблема легко решается функцией SendMessage( hTargetWnd, ... ).


А нельзя ли этот код посмотреть как нить для повышения образованности а то я пробовал под MFC такое сделать но нифига не вышло тк главное диалоговое окно ничем не отличается от обычного модального диалогового окна просто после завершения работы с этим окном закрывается и приложение.

351
15 апреля 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by CyberMan
А нельзя ли этот код посмотреть как нить для повышения образованности а то я пробовал под MFC такое сделать но нифига не вышло тк главное диалоговое окно ничем не отличается от обычного модального диалогового окна просто после завершения работы с этим окном закрывается и приложение.



Назовем наше приложение MyApp.

1. добавляем в объявление класса CMyApp переменную HACCEL hAccel.

2. В функции CMyApp::InitInstance() добавляем следующую строчку :

 
Код:
hAccel = LoadAccelerators( m_hInstance, MAKEINTRESOURCE( IDR_ACCELERATORS ) );


3. Перегружаем метод СMyApp::PreTranslateMessage.

 
Код:
BOOL CFileManagerApp::PreTranslateMessage(MSG* pMsg)
{
    return TranslateAccelerator( m_pMainWnd->m_hWnd, hAccel, pMsg );
}


в таком плане у меня все работает, при немодальном диалоговом окне.

Цитата:
Originally posted by CyberMan

...ничем не отличается от обычного модального диалогового окна просто после завершения работы с этим окном закрывается и приложение.



Утверждение неправильное. В професионально написанных приложениях после закрытия окна еще выполняется разная работа, например очистка ресурсов.

351
15 апреля 2005 года
PitxBull
633 / / 22.12.2004
Цитата:
Originally posted by sq_deep
Попробуйте, может быть, получится.



Мне пробовать нечего, у меня все работает.

Цитата:
Originally posted by sq_deep

Дело в том, что MFC вызывает TranslateAccelarator в основном цикле обработки сообщений, а диалог организует свой цикл, в котором акселераторы не используются. Вероятно, можно вызвать TranslateAccelarator и в цикле обработки сообщений диалога, но только боюсь, вам придётся переписать для этого половину MFC.



Лень мне ковыряться в исходниках MFC, проверять действительно ли это так ( хороший практический пример когда понадобилось посмотреть код функции но хрен поймешь где он находится. Comments must die ). И потом это верно не во всех случаях. В частности у меня НеМодальное диалоговое окно получает сообщения из основного цикла.

430
15 апреля 2005 года
craftyfox
157 / / 20.02.2000
Первое, что пришло в голову, это вот это
(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 модального диалога,
которая создается системой
(слышал, что есть какие-то "неочевидные" способы,
но ничего о них не знаю).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог