slou₧φ v MFC jako nßhrada WindowProc(...) z API. To
neznamenß, ₧e WindowProc v MFC neexistuje. Mapa zprßv je jenom jin² zp∙sob
jak ji implementovat.
Mφsto toho, aby jste psali obrovsk² switch, si jen nadefinujete funkci, kterß
se mß vykonat p°i p°ijetφ urΦitΘ zprßvy (p°ed deklaraci musφte napsat
afx_msg) a do odpovφdajφcφho mφsta .cpp souboru p°idßte makro odpovφdajφcφ
zprßv∞.
Nßsledujφcφ ukßzka implementuje odchycenφ WM_LBUTTONDOWN, WM_COMMAND (od polo₧ky menu s identifikßtorem ID_MENUITEM) a u₧ivatelsky definovanΘ zprßvy WM_USER+10 v tomto po°adφ.
class CMyView : public CView
{
...
...
...
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnMenuItem( );
afx_msg LRESULT OnUser10(WPARAM, LPARAM);
...
...
...
}
Najd∞te odpovφdajφcφ Φßst cpp souboru a sem p°idejte makra (ruΦn∞ p°idanß Φßst je na zv²razn∞nΘm pozadφ)
BEGIN_MESSAGE_MAP(CMyView, CView)
//{{AFX_MSG_MAP(CMyView)
//}}AFX_MSG_MAP
Mezi p°edchozφ dva komentß°e °uΦn∞ nic nep°idßvejte, tam si p°idßvß makra ClassWizard
ON_WM_LBUTTONDDOWN()
ON_COMMAND(ID_MENUITEM, OnMenuItem)
ON_MESSAGE(WM_USER+10, OnUser10)
END_MESSAGE_MAP()
Do libovolnΘ Φßsti cpp souboru p°idejte definice funkcφ.
void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
// Funkce odpovφdajφcφ stisknutφ levΘho tlaΦφtka myÜi
// Zde p°idejte sv∙j k≤d
CString s;
s.Format("Bylo stisknuto tlaΦφtko na pozici X: %d, Y: %d", point.x, point.y);
MessageBox(s);
/* Nakonec zavolejte obsluhu tΘto zprßvy zßkladnφ t°φdy. Pokud tato obsluha d∞lß n∞co co nechcete, tak ji volat nemusφte, ale pokud vßm nezp∙sobuje ₧ßdnΘ problΘmy, tak by jste ji zavolat m∞li. Pokud se to z n∞jakΘho d∙vodu nedoporuΦuje a vytvß°φte tuto funkci pomocφ ClassWizardu, tak jste na to formou komentß°e upozorn∞ni. Zatφm jedinß zprßva, o kterΘ vφm ₧e p°φmo zakazuje volßnφ obsluhy z rodiΦovskΘ t°φdy je WM_PAINT. */
CView::OnLButtonDown(nFlags, point);
}
void CMyView::OnMenuItem()
{
// Funkce odpovφdajφcφ zvolenφ polo₧ky menu ID_MENUITEM
// Funkce reagujφcφ na ON_COMMAND funkci zßkladnφ t°φdy nemajφ
}
LRESULT CMyView::OnUser10(WPARAM wParam, LPARAM lParam)
{
// Funkce odpovφdajφcφ u₧ivatelskΘ zprßv∞ WM_USER+10
// TakΘ funkce reagujφcφ na u₧ivatelskΘ zprßvy nemajφ funkci zßkladnφ t°φdy
}
Zprßva | Makro | Parametry makra | Funkce | Nßvratovß hodnota | Parametry funkce | Mß funkci zßkladnφ t°φdy |
Standartnφ zprßvy nap°. WM_LBUTTONDOWN WM_KEYDOWN WM_CREATE |
Odpovφdß jmΘnu zprßvy, jen na zaΦßtek je p°idßno ON_ nap°: ON_WM_CREATE() | Nemajφ parametry | Odpovφdß jmΘnu zprßvy nap°: OnCreate |
Zßvisφ na zprßv∞ | Zßvisφ na zprßv∞, nap°. pro zprßvu WM_CREATE je LPCREATESTRUCT | ANO |
U₧ivatelskΘ zprßvy: WM_USER + ... |
ON_MESSAGE | Zprßva, jmΘno funkce | Se jmΘnem odpovφdajφcφm parametru makra | LRESULT | WPARAM, LPARAM | NE |
Od polo₧ek menu a akcelerßtor∙ WM_COMMAND |
ON_COMMAND | Identifikßtor polo₧ky menu nebo akcelerßtoru, jmΘno funkce | Se jmΘnem odpovφdajφcφm parametru makra | void | Nemß parametry | NE |
Od dialogov²ch prvk∙ WM_COMMAND |
Zßvisφ na notifikaΦnφm k≤du (tj. hodnot∞
HIWORD(wParam)) nap°. ON_BN_CLICKED |
Identifikßtor dialogovΘho prvku, jmΘno funkce | Se jmΘnem odpovφdajφcφm parametru makra | void | Nemß parametry | NE |
Pokud vßm tento zp∙sob nevyhovuje, m∙₧ete pou₧φt klasick² zp∙sob zpracovßnφ zprßv. T°φda CWnd obsahuje virtußlnφ funkci WindowProc, kterß mß ·pln∞ stejn² v²znam jako API WindowProc. LiÜφ se jen tφm ₧e ta z CWnd nemß prvnφ parametr (tj. handle okna). To je ulo₧eno jako Φlenskß prom∞nnß t°φdy CWnd::m_hWnd.