Pokud jste n∞kdy vytvß°eli aplikaci bez pou₧itφ pr∙vodc∙ nebo bez okna rßmu vytvo°enΘho pomocφ funkce CFrameWnd::LoadFrame(), zjistili jste, ₧e vßm nefungujφ akcelerßtory. Kdy₧ mßte okno rßmce, je jejich zapnutφ jednoduchΘ. StaΦφ zavolat funkci CFrameWnd::LoadAccelTable(), kterß je nahraje. Potom ji₧ pro toto okno (a jeho d∞tskß okna) akcelerßtory fungujφ.
Ale t°φda CWnd tuto funkci nemß, proto₧e akcelerßtory nepodporuje. Podle mΘho nßzoru je to proto, ₧e se p°edpoklßdß, ₧e toto okno se bude pou₧φvat jako d∞tskΘ okno okna rßmu. V tomto p°φpad∞ toti₧ stejn∞ jsou akcelerßtory odchytnuty rodiΦem (i kdy₧ je jφm nap°. dialog, kter² akcelerßtory takΘ nepodporuje) a naÜemu d∞tskΘmu oknu se nedostanou. Akcelerßtory se toti₧ p°eklßdajφ ve funkci PreTranslateMessage(), kterß se pro d∞tskß okna nevolß.
P°idat tuto podporu do libovolnΘ t°φdy okna je velmi jednoduchΘ. (Nßsledujφcφ p°φklad je pro potomka t°φdy CWnd)
StaΦφ p°idat Φlenskou prom∞nnou typu HACCEL, co₧ je handle naÜich nahrßt²ch akcelerßtor∙.
nap°.
HACCEL m_hAccel;
PotΘ musφte p°idat funkci pro jejich nahrßnφ.
nap°.
BOOL LoadAccelTable(LPCTSTR nIdResource);
a jejφ definici
BOOL CAccelWnd::LoadAccelTable(UINT nIdResource)
{
if (m_hAccel) //Pokud ji₧ byly n∞jakΘ akcelerßtory nahrßny uvolnφme je
{
if (!::DestroyAcceleratorTable(m_hAccel)) return FALSE;
m_hAccel = NULL;
}
m_hAccel = ::LoadAccelerators(AfxGetInstanceHandle(),MAKEINTRESOURCE(nIdResource));
return m_hAccel!=NULL;
}
A nakonec p°etφ₧φme virtußlnφ funkci PreTranslateMessage, ve kterΘ je pou₧ijeme. Tato funkce slou₧φ pro prßci se zprßvami jeÜte p°ed volßnφm funkcφ TranslateMessage a DispatchMessage (tj. p°ed jejφm umφst∞nφm do smyΦky zprßv) a vracφ TRUE, pokud se zprßva ji₧ zpracovala a nemß se s nφ ji₧ dßle nic d∞lat a FALSE, pokud se mß zprßva normßln∞ zpracovat.
BOOL CAccelWnd::PreTranslateMessage(MSG* pMsg)
{
if (CWnd::PreTranslateMessage(pMsg)) return TRUE; // Nejd°φve zkontrolujeme zda nenφ zprßva zpracovßna standartnφ funkcφ.
if (pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST) // Pokud je zprßva od klßvesnice
{
// Zavolßme funkci pro p°eklad akceslerßtor∙
return ((m_hAccel != NULL) && ::TranslateAccelerator(m_hWnd, m_hAccel, pMsg));
}
// Pokud nenφ zprßva od klßvesnice a nebyla zpracovßna standartnφ funkcφ vrßtφme FALSE, aby se p°idala do smyΦky zprßv.
return FALSE;
}
POZOR!!! Tato funkce se volß jen pro rodiΦovskß okna. Tak₧e u d∞tsk²ch oken se akcelerßtory takto nedajφ odchytit.