La o aplicatie SDI/MDI, o tabela de acceleratori este adaugata de MFC AppWizard. De asemenea, pentru SDI/MDI, framework-ul MFC incarca tabela de acceleratori, proceseaza acceleratorii si distruge tabela de acceleratori atunci cand se inchide aplicatia.
Cum se poate face acelasi lucru intr-o aplicatie dialog-based?
Rezolvare
- In editorul de resurse, se adauga si se completeaza o resursa tip "Accelerator".
- Se adauga in clasa dialogului principal un membru tip HACCEL.
Code: Select all
// MainDialog.h class CMainDialog : public CDialog { HACCEL m_hAppAccel; // accelerators table handle // ... };
- In OnInitDialog se incarca tabela de acceleratori.
Code: Select all
// MainDialog.cpp // ... BOOL CMainDialog::OnInitDialog() { CDialog::OnInitDialog(); // ... VERIFY(m_hAppAccel = ::LoadAccelerators(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_APP_ACCELERATORS))); return TRUE; }
- Se suprascrie functia virtuala PreTranslateMessage si de procesaza acceleratorii.
Code: Select all
BOOL CMainDialog::PreTranslateMessage(MSG* pMsg) { if(::TranslateAccelerator(GetSafeHwnd(), m_hAppAccel, pMsg)) { return TRUE; } // ... return CDialog::PreTranslateMessage(pMsg); }
- In fine, se distruge tabela de acceleratori la inchiderea aplicatiei.
Code: Select all
void CMainDialog::OnClose() { ::DestroyAcceleratorTable(m_hAppAccel); // ... CDialog::OnClose(); }