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

Despre MFC, ATL si alte biblioteci C++ de la Microsoft (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

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

Post by Ovidiu Cucu » 08 Aug 2011, 09:41

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



Post Reply