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


Автор: EvgenyTS 16.2.2009, 15:54
Код

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);
}


И при нажатии на клавиши(акселератора) не вызывается функция. ЧТо может быть такое?

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

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

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

Автор: EvgenyTS 16.2.2009, 17:49
Цитата(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).

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

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

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