Nu-ncerca, ca-ncerci degeaba...
In primul rand,
LBN_KILLFOCUS nu-i un mesaj ci o notificare care vine cu mesajul
WM_COMMAND. La fel si celelalte LBN_uri sau alte notificari trimise prin
WM_COMMAND sau
WM_NOTIFY, nu o sa le prinzi cu ceva de genul
Code: Select all
if(LBN_KILLFOCUS == pMsg->message)
Mai departe, scrie la documentatie precum ca
PreTranslateMessage este...
... used by class CWinApp to translate window messages before they are dispatched to the TranslateMessage and DispatchMessage Windows functions
Deci e chemata pe undeva prin bucla care ia mesaje din coada de mesaje.
Daca scrii, de exemplu
Code: Select all
int nRet = m_listBox.FindString(-1, _T("Tra-la-la!"));
si te uiti in spate, vezi ceva de genul
Code: Select all
_AFXWIN_INLINE int CListBox::FindString(int nStartAfter, LPCTSTR lpszItem) const
{ ASSERT(::IsWindow(m_hWnd)); return (int)::SendMessage(m_hWnd, LB_FINDSTRING,
nStartAfter, (LPARAM)lpszItem); }
Retinem "
SendMessage" si ne uitam la acest FAQ:
Deosebirea intre PostMessage si SendMessage.
SendMessage nu pune mesajul in coada de mesaje ci il paseaza direct la functia fereastra (a controlului listbox, in cazul nostru).
Nu e pus in coada, deci nu are cum nici sa ajunga la
PreTranslateMessage.
Clar pana aici?
Acuma, doar de curiozitate, for fun si/sau sa vezi ca am dreptate, posteaza listei un
LB_FINDSTRING cu
PostMessage si-ai sa vezi ce se intampla. Doar for fun...
Mai bine insa, lasa in pace pe
PreTranslateMessage (ca nu prinde tot ce zboara

) si mapeaza frumusel mesajele/notificarile.
Pentru
LBN_KILLFOCUS te ajuta wizard-ul cu
ON_CONTROL_REFLECT.
Pentru care nu (ex.
LB_FINDSTRING) mapezi la mana cu
ON_MESSAGE, cam asa:
Code: Select all
class CMyListBox : public CListBox
{
// ...
afx_msg LRESULT OnLbFindString(WPARAM wParam, LPARAM lParam);
};
Code: Select all
BEGIN_MESSAGE_MAP(CMyListBox, CListBox)
ON_MESSAGE(LB_FINDSTRING, &CMyListBox::OnLbFindString)
ON_CONTROL_REFLECT(LBN_KILLFOCUS, &CMyListBox::OnLbnKillfocus)
END_MESSAGE_MAP()
// CMyListBox message handlers
LRESULT CMyListBox::OnLbFindString(WPARAM wParam, LPARAM lParam)
{
// Face, drege, arde, frige...
return Default();
}