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

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 prindem click-uri intr-un control static?

Post by Ovidiu Cucu » 05 Aug 2011, 08:52

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



Post Reply