Page 1 of 1

[MFC] Cum prindem click-uri intr-un control static?

Posted: 05 Aug 2011, 08:52
by Ovidiu Cucu
Problema
Desi am mapat notificarea STN_CLICKED (sau BN_CLICKED) in dialogul parinte al unui control static (static text sau picture), programul nu intra in functia handler corespunzatoare atunci cand dau click pe controlul static.
Exemplu

Code: Select all

// ParentDialog.h
// ...
class CParentDialog : public CDialog
{
   // ...
   afx_msg void OnClickedStaticTest();
   // ...
};

Code: Select all

// ParentDialog.cpp
   // ...
   ON_BN_CLICKED(IDC_STATIC_TEST, OnClickedStaticTest)
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CParentDialog::OnClickedStaticTest() 
{
   // <-- the program never enters here.
}
Acelasi lucru se intampla daca mapez mesajul reflectat =STN_CLICKED (sau =BN_CLICKED) intr-o clasa derivata din CStatic.
Exemplu

Code: Select all

// CustomStatic.h 
class CCustomStatic : public CStatic
{
   // ...
   afx_msg void OnClicked();
   // ...
};

Code: Select all

// CustomStatic.cpp
   // ...
   ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
   //}}AFX_MSG_MAP
END_MESSAGE_MAP()

void CCustomStatic::OnClicked() 
{
   // <-- the program never enters here.
}
Cauza
Controalele statice (avand clasa fereastra "Static") sunt controale simple destinate sa afiseze un text, un dreptunghi sau o imagine si in mod normal nu primesc input de la utilizator, incluzand mesajele de mouse. In consecinta, acestea nici nu notifica fereastra (dialogul) parinte.

Rezolvare
Daca totusi e nevoie de tratat mesajele de mouse (incluzand notificarea STN_CLICKED), controlul static trebuie sa aiba setat stilul SS_NOTIFY (proprietatea "Notify" in editorul de resurse).

Note
  • STN_CLICKED si BN_CLICKED au aceeasi valoare. Desi pentru controlul static este definit STN_CLICKED, in lista de la ClassWizard din VC++6.0 apare BN_CLICKED.
  • Pentru a putea mapa notificarile unui control static, trebuie schimbat ID-ul default pe care-l pune editorul de resurse, IDC_STATIC.
Vezi si << Back to MFC index