Page 1 of 1

[MFC] Cum adaug acceleratori unei aplicatii dialog-based?

Posted: 08 Aug 2011, 09:41
by Ovidiu Cucu
Problema
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
  1. In editorul de resurse, se adauga si se completeaza o resursa tip "Accelerator".
  2. 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
    // ...
    };
  3. 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;
    }
  4. 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);
    }
  5. In fine, se distruge tabela de acceleratori la inchiderea aplicatiei.

    Code: Select all

    void CMainDialog::OnClose() 
    {
       ::DestroyAcceleratorTable(m_hAppAccel);
       // ...
       CDialog::OnClose();
    }
Vezi si << Back to MFC index