..::Akcelerßtory (klßvesovΘ zkratky)::..

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.