OnKeyup on CListCtrl

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
Post Reply
mesajflaviu
Membru++
Membru++
Posts: 688
Joined: 10 Sep 2008, 21:40
Judet: Cluj

OnKeyup on CListCtrl

Post by mesajflaviu » 21 Aug 2012, 09:55

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 ?



mesajflaviu
Membru++
Membru++
Posts: 688
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: OnKeyup on CListCtrl

Post by mesajflaviu » 22 Aug 2012, 09:18

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 ...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: OnKeyup on CListCtrl

Post by Ovidiu Cucu » 22 Aug 2012, 13:18

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.

mesajflaviu
Membru++
Membru++
Posts: 688
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: OnKeyup on CListCtrl

Post by mesajflaviu » 22 Aug 2012, 13:38

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 ...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: OnKeyup on CListCtrl

Post by Ovidiu Cucu » 22 Aug 2012, 16:48

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.

mesajflaviu
Membru++
Membru++
Posts: 688
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: OnKeyup on CListCtrl

Post by mesajflaviu » 22 Aug 2012, 17:06

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 ...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: OnKeyup on CListCtrl

Post by Ovidiu Cucu » 22 Aug 2012, 17:15

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.

mesajflaviu
Membru++
Membru++
Posts: 688
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: OnKeyup on CListCtrl

Post by mesajflaviu » 22 Aug 2012, 17:21

Asa e, in primul caz CMyListCtrl sta intr-un CChildFrame, iar in al doilea caz CMyListCtrl e pus pe un CFormView ... asa-i ...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3776
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: OnKeyup on CListCtrl

Post by Ovidiu Cucu » 22 Aug 2012, 17:24

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.

Post Reply