Page 1 of 1

OnKeyup on CListCtrl

Posted: 21 Aug 2012, 09:55
by mesajflaviu
Pe un formview am 3 controale CListCtrl, pe unul din ele am incercat sa "prind" OnKeyup ... n-am reusit decat prin PreTranslateMessage, si nu cred ca e bine ... am vazut ca nu am disponibil in maparea CListCtrl decat LVN_KEYDOWN, nu si LVN_KEYUP ... ar fi vreo solutie ?

Code: Select all

	ON_NOTIFY(LVN_KEYDOWN, IDC_LIST1, OnKeydownList1)
...
am macelarit PreTranslateMessage in modul urmator si functioneaza ... dar nu imi place ce a iesit :

Code: Select all

BOOL CTestListView::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class

	if(pMsg->message == WM_KEYUP && GetFocus() == GetDlgItem(IDC_LIST) && 
		(pMsg->wParam == VK_DOWN || 
		pMsg->wParam == VK_UP || 
		pMsg->wParam == VK_NEXT || 
		pMsg->wParam == VK_PRIOR || 
		pMsg->wParam == VK_HOME || 
		pMsg->wParam == VK_END))
	{
		TRACE("DoSomething ...\n");
	}

	return CFormView::PreTranslateMessage(pMsg);
}
ar fi alta solutie ?

Re: OnKeyup on CListCtrl

Posted: 22 Aug 2012, 09:18
by mesajflaviu
O alta problema : cum mapez pentru lista IDC_LIST1, in conditiile de mai sus WM_MBUTTONDOWN ? Nu cred ca ar fi bine sa derivez o clasa derivata din CListCtrl pentru a putea face aceste lucruri ...

Re: OnKeyup on CListCtrl

Posted: 22 Aug 2012, 13:18
by Ovidiu Cucu
In primul rand, LVN_KEYUP nu e in lista wizard-ului pentru simplul motiv ca sistemul nu trimite o asemenea notificare.
In al doilea rand, iata ce zic eu din nou: lasa in pace pe cat posibil PreTranslateMessage, mai ales daca scopul este sa prinzi mesajele pentru copii in fereastra parinte, daca nu vrei ca la un momentdat sa te doara capul ce cod se aduna acolo. In plus s-ar putea sa strici oaresce default behaviors care totusi trebuie.

Deci, una din doua:
  1. sau lucrezi in fereastra parinte si-atunci mapezi doar notificarile "standard", folosind wizard-ul.
  2. sau daca vrei sa dai putin mai adanc cu bardita-n control, il subclasezi in clasa ta proprie.

Re: OnKeyup on CListCtrl

Posted: 22 Aug 2012, 13:38
by mesajflaviu
In primul rand multumesc pentru raspuns. WM_KEYUP mi-ar fi trebuit sa pun in status bar cate randuri a selectat user-ul, de aia nu mi-e de folos LVN_KEYDOWN, si apoi la WM_MBUTTONDOWN as fi pus un window-scroller (pentru ca IDC_LIST1 e intins) ... nu stiu cum rezolv pana la urma, ma mai gandesc ... baiu e ca a trebuit sa pun lista asta pe un formview, caci toate aceste probleme s-ar fi putut rezolva cu usurinta intr-un listview ...

Re: OnKeyup on CListCtrl

Posted: 22 Aug 2012, 16:48
by Ovidiu Cucu
Pai care-i baiul? Cred ca am mai spus ca atat CListCtrl cat si CListView fac unul si acelasi lucru: tin un contol "SysListView32".
Deosebrea e ca primei ii sta bine intr-un dialog (incluzind unul dintr-un formview) iar celeilalte ii place sa stea cuminte intr-un frame SDI/MDI.

Re: OnKeyup on CListCtrl

Posted: 22 Aug 2012, 17:06
by mesajflaviu
In cazul cand view-ul era derivat din CListView, am putut mapa WM_KEYUP si WM_MBUTTONDOWN in clasa CMyListView :

Code: Select all

///
BEGIN_MESSAGE_MAP(CMyListView, CListView)
	//{{AFX_MSG_MAP(CMyListView)
	ON_WM_KEYUP()
	ON_WM_MBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
///
void CMyListView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default

	DoSomething();

	CListView::OnKeyUp(nChar, nRepCnt, nFlags);
}

void CMyListView::OnMButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default

	if(! m_bMenu)CWindowScroller* ws = new CWindowScroller(this, point);

	CListView::OnMButtonDown(nFlags, point);
}

ceea ce n-am reusit in cazul cand am pus controlul CListCtrl pe un formview, decat prin derivarea unei clase derivate din CListCtrl in care am prins cele doua mesaje ... bun, pana la urma si asa e bine, doar ca in primul caz a fost mai usor ...

Re: OnKeyup on CListCtrl

Posted: 22 Aug 2012, 17:15
by Ovidiu Cucu
Aha! :D
Pai nu-i unul si-acelasi lucru precum am spus?
Ai CMyListView derivata din CListView in care ai mapat cu succes WM_KEYUP si WM_MBUTTONDOWN.
Identic si la fel, mapezi WM_KEYUP si WM_MBUTTONDOWN in clasa CMyListCtrl, derivata din CListCtrl.

Re: OnKeyup on CListCtrl

Posted: 22 Aug 2012, 17:21
by mesajflaviu
Asa e, in primul caz CMyListCtrl sta intr-un CChildFrame, iar in al doilea caz CMyListCtrl e pus pe un CFormView ... asa-i ...

Re: OnKeyup on CListCtrl

Posted: 22 Aug 2012, 17:24
by Ovidiu Cucu
Clasa derivata din CFormView e alta mancare de peste. Asta tine un dialog, de obicei umplut cu controale copil. In ea prinzi notificarile copiilor (ex. LVN_KEYDOWN, trimisa via WM_NOTIFY) si nu orice mesaj "zboara" prin controalele copil.