Поиск:

Ответ в темуСоздание новой темы Создание опроса
> работа с акселератором 
:(
    Опции темы
EvgenyTS
Дата 16.2.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 26.11.2008

Репутация: нет
Всего: нет



Код

h_Tree = GetSafeHwnd();


Код

hInst = AfxFindResourceHandle(MAKEINTRESOURCE(IDR_ACCEL), RT_ACCELERATOR);
            m_hAcc = ::LoadAccelerators(hInst, MAKEINTRESOURCE(IDR_ACCEL));


Код

BOOL CTree::PreTranslateMessage(MSG* pMsg) 
{
    while (GetMessage(pMsg, (HWND) NULL, 0, 0))
    {
    
        if (!TranslateAccelerator(
            h_Tree,                    
            m_hAcc,                    
            pMsg))                    
        {
            TranslateMessage(pMsg);
            DispatchMessage(pMsg);
        }
    }

    return CTree::PreTranslateMessage(pMsg);
}


И при нажатии на клавиши(акселератора) не вызывается функция. ЧТо может быть такое?
PM MAIL   Вверх
Earnest
Дата 16.2.2009, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



А что, все остальное у тебя работает? При том, что ты GetMessage засунул в PreTranslate дерева? Или это не контрол?
В общем, не надо GetMessage использовать... Также как Translate\Dispatch. MFC само реализует главный цикл.
Код должен быть примерно такой:
Код

    if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
    {
        return ::TranslateAccelerator(m_hWnd, hAccel, pMsg);
    }

НО. Если ты хочешь, чтобы горячие клавиши срабатывали всегда, то код нужно добавить куда-нибудь повыше (в главное окно). 



--------------------
...
PM   Вверх
EvgenyTS
Дата 16.2.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 26.11.2008

Репутация: нет
Всего: нет



Цитата(Earnest @  16.2.2009,  17:06 Найти цитируемый пост)
код C++
1:
2:
3:
4:
    
    if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
    {
        return ::TranslateAccelerator(m_hWnd, hAccel, pMsg);
    }

и так пытался, не выходит
Это у меня класс наследованный от CTreeCtrl. Я его эскпортирую(создаю dll).
PM MAIL   Вверх
Earnest
Дата 16.2.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Во-первых, не надо делать return, оставь стандартную обработку.
Во-вторых, как я уже говорила, до PreTranslate дерева дело может просто не дойти: PreTranslat'ы вызываются от приложения вниз. Лови в главном окне.
Но чтобы разобраться, попробуй поставить точку прерывания на свой TranslateAccel. Вопрос еще в том, что команду, которая получится, тоже он должен обработать. Ты это делаешь?

Добавлено через 2 минуты и 18 секунд
В общем, правильнее всего ловить акселераторы в том же окне, которое обрабатывает команды. Плюс позаботиться о том, чтобы в этот PreTranslate доходило управление (его могут перехватить окна, которые являются "более родительскими").


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.