[MFC] Cum tratez notificari pentru controale create dinamic?

Despre MFC, ATL si alte biblioteci C++ de la Microsoft (forum moderat)
Post Reply
User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

[MFC] Cum tratez notificari pentru controale create dinamic?

Post by Marius Bancila » 30 Jul 2007, 12:08

Intrebare: Cum pot trata notificari pentru controale create dinamic, precum BN_CLICKED pentru butoane?

Raspuns: Atunci cand creezi un control dinamic, trebuie sa faci ceea ce wizard-ul cand folosesti editorul de resurse. Cu alte cuvinte:
  • definirea unui ID pentru control (in resource.h)
  • definirea unui handler cu (semnatura corecta)
  • adaugarea unui intrari in harta mesajelor
La definirea unui ID, asigurati-va ca acesta este unic, altfel ar putea apare probleme:

Code: Select all

#define IDC_MY_BUTTON    1234
Acest ID este folosit ca argument pentru functia Create().

Code: Select all

BOOL CSampleDialog::OnInitDialog()
{
  CDialog::OnInitDialog();

  m_pMyButton->Create("Buton dinamic", WS_CHILD|BS_PUSHBUTTON, CRect(100,100, 28, 100), this, IDC_MY_BUTTON);

  return TRUE;
};
Sa luam ca exemplu o clasa CSampleDialog, care in cea mai simpla varianta, are urmatoare declaratie:

Code: Select all

class CSampleDialog : public CDialog
{
public:
  CSampleDialog(CWnd* pParent = NULL);
  
protected:
  virtual void DoDataExchange(CDataExchange* pDX);

  DECLARE_MESSAGE_MAP()
};
La aceasta clasa trebuie adaugat handler-ul pentru notificare. Trebuie avut grija cu semnatura handler-ului, intrucat notificari diferite necesita handlere cu semnaturi diferite.

Code: Select all

afx_msg void OnMyButtonClicked();
Bineinteles, trebuie ca functia sa fie si definita:

Code: Select all

void CSampleDialog::OnMyButtonClicked()
{
  AfxMessageBox("Ati apasat butonul creat dinamic!");
}
Pentru ca functia de tratare sa fie apelata in cazul apasarii butonului, trebuie adauga urmatoare intrare in harta de mesaje:

Code: Select all

BEGIN_MESSAGE_MAP(CSampleDialog, CDialog)
  ON_BN_CLICKED(IDC_MY_BUTTON, &CSampleDialog::OnMyButtonClicked)
END_MESSAGE_MAP()

<< Back to MFC index


Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

Post Reply