15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


CListCtl Question

Gerry Sweeney -- gerry@hornbill.com
Tuesday, March 11, 1997


Environment: NT3.51 SP3, MSVC20, MFC

Dear Listers,

I have implemented a CListCtrl inside a view. I seem to be unable to get a 
notification from the list box when I double-click on an item in the list. 
What I need is

a) the double-click notification
b) the item that was double-clicked

Any help would be appreciated


Kind Regards

Gerry Sweeney
gerry@hornbill.com









Jason Healy -- jason@hkjcs.oz.au
Tuesday, March 18, 1997

Use class wizard to add the notification

	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)

and implement your function as follows:

	void CMyListView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
	{
		// Need to find the co-ordinates of the message
		const MSG * pmsg = GetCurrentMessage();
		CPoint pt = pmsg->pt;
		m_list.ScreenToClient(&pt);
		pt.x = 0;				// HitTest only works in first column - so lets pretend
thats where it is


		CListCtrl& list = GetListCtrl();
		UINT nFlags;
		int nItem = list.HitTest(pt, &nFlags);
		if (nItem != -1 && nFlags & LVHT_ONITEM) {
		
			// Do want you want nItem is the 0 based index
		}
		
		*pResult = 0;
	}

Jason
jason@hkjcs.oz.au

----------
> [Mini-digest: 7 responses]
> 
> >I have implemented a CListCtrl inside a view. I seem to be unable to get
a 
> >notification from the list box when I double-click on an item in the
list. 
> >What I need is
> >
> >a) the double-click notification
> >b) the item that was double-clicked
> 
> A view is a window derived object and you can handle window messages as
you 
> seem fit.
> In your case, you can simply set a handler for ON_WM_LBUTTONDBLCLK() in
your 
> msg map.
> 
> In your handler implementation, you'll receive a CPoint as the second
> argument,
> 
> yourview::Onxxx(UINT, CPoint point)
> 
> To see if the control was hit, you can use
> 
> LV_HITTEST lvh;
> lvh.pt = point;
> if(yourlistctl.HitTest(&lvh) != -1){
>   // then your item is "lvh.iItem"
> }
> 
> Mario
> mcontest@universal.com
> 
> -----From: "Arkady  Elterman" 
> 
> In order to achieve this, I had to capture WM_LBUTTONDBLCLK message in the
> list control's parent's PreTranslateMessage() function (making sure that
> the list control had focus at that time) and then use the control's
> HitTest() method to determine which item was clicked.
> 
> Although it worked fine, I'm still curious, too, if there is a better
way. 
> I was surprised not to find LVN_DBLCLK (similar to LBN_DBLCLK) among list
> control's notifications.
> 
> ---
> Arkady Elterman
> arkady@neca.com
> http://www.neca.com/~arkady/spin.htm
> 
> ----------
> : From: Gerry Sweeney 
> : To: mfc-l 
> : Subject: CListCtl Question
> : Date: Tuesday, March 11, 1997 5:52 AM
> : 
> : 
> : Environment: NT3.51 SP3, MSVC20, MFC
> : 
> : Dear Listers,
> : 
> : I have implemented a CListCtrl inside a view. I seem to be unable to get
> a 
> : notification from the list box when I double-click on an item in the
> list. 
> : What I need is
> : 
> : a) the double-click notification
> : b) the item that was double-clicked
> : 
> : Any help would be appreciated
> : 
> : 
> : Kind Regards
> : 
> : Gerry Sweeney
> : gerry@hornbill.com
> : 
> : 
> : 
> : 
> : 
> : 
> -----From: "Anthony V. Paul" 
> 
> Gerry Sweeney wrote:
> > 
> > Environment: NT3.51 SP3, MSVC20, MFC
> > 
> > Dear Listers,
> > 
> > I have implemented a CListCtrl inside a view. I seem to be unable to
get a
> > notification from the list box when I double-click on an item in the
list.
> > What I need is
> > 
> > a) the double-click notification
> > b) the item that was double-clicked
> > 
> > Any help would be appreciated
> > 
> > Kind Regards
> > 
> > Gerry Sweeney
> > gerry@hornbill.com
> 
> 
> If you generate your view from clistctrl (i.e. CMyView : CListView) you
> will be able to easily get the messages thru Class Wizzard.
> 
> If it is to late to do this, the following code may help:
> 
> I had a CListCtrl inside a CDialogBar, this code worked.  Later I
> changed to a CTreeCtrl, and made my view class derived from CTreeView.
> 
> Hope this helps
> 
> avp
> 
> BOOL CAlbum::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
> {
> 	LPNMHDR		phdr = (LPNMHDR)lParam;
> 	
> 	switch( phdr->code )
> 	{
> 	case	NM_DBLCLK:
> 		{
> 			POINT		pt;
> 
> 			GetCursorPos( &pt );
> 
> 			::ScreenToClient( phdr->hwndFrom, &pt );
> 
> 			int			nRet;
> 
> 			if( ( nRet = ((CListCtrl*)GetDlgItem( IDC_ALBUM
> ))->HitTest( pt ) )
> != -1 )
> 			{
> 				// nRet is the index of the item we hit.
> 				
> 				CString		strAlbum =
> ((CListCtrl*)GetDlgItem( IDC_ALBUM
> ))->GetItemText( nRet, 0 );
> 
> 				if( ((CMainFrame*)AfxGetMainWnd())->bOpenAlbum(
> strAlbum ) )
> 				{
> 					// Set the icon to the open book
> 					LV_ITEM		lv;
> 
> 					lv.mask = LVIF_IMAGE;
> 					lv.iItem = nRet;
> 					lv.iSubItem = 0;
> 					lv.iImage = 1;
> 
> 					((CListCtrl*)GetDlgItem( IDC_ALBUM
> ))->SetItem( &lv  );
> 				}
> 			}
> 		}
> 
> 		break;
> 
> 	case	LVN_BEGINLABELEDIT:
> 		{
> 			LV_DISPINFO FAR*	pdi = (LV_DISPINFO FAR*)lParam;
> 
> 			LV_ITEM		lv;
> 
> 			lv.mask = LVIF_IMAGE;
> 			lv.iItem = pdi->item.iItem;
> 			lv.iSubItem = 0;
> 
> 			// Only allow editing if the album is not open.
> 			if( ((CListCtrl*)GetDlgItem( IDC_ALBUM ))->GetItem( &lv 
> ) )
> 			{
> 				// Is the icon not the open one?
> 				if( lv.iImage != 1 )
> 				{
> 					// Allow editing
> 					SetWindowLong( m_hWnd, DWL_MSGRESULT,
> TRUE );
> 					return TRUE;
> 				}
> 				else
> 				{
> 					// DO NOT allow
> 					MessageBox( _T("Please close the album
> before editing its name."),
> _T("Notice:") );
> 					SetWindowLong( m_hWnd, DWL_MSGRESULT,
> FALSE );
> 					return TRUE;
> 				}
> 			}
> 
> 
> 		}
> 		break;
> 	
> 	case	LVN_ENDLABELEDIT:
> 		{
> 			LV_DISPINFO FAR*	pdi = (LV_DISPINFO FAR*)lParam;
> 
> 			// If the text is valid, there wasn't a cancel.
> 			if( pdi->item.pszText )
> 			{
> 				CString	strCurrentLabel =
> ((CListCtrl*)GetDlgItem( wParam
> ))->GetItemText( pdi->item.iItem, 0 );
> 				long						
> Id;
> 				BOOL						
> Ret = FALSE;
> 
> 				if(
> ((CMainFrame*)AfxGetMainWnd())->bDoesFolderExist(
> strCurrentLabel, lId ) )
> 					bRet =
> ((CMainFrame*)AfxGetMainWnd())->bEditAlbumLabel(
> pdi->item.pszText, strCurrentLabel );
> 				else
> 					// OK, lets try and create the album
> 					bRet =
> ((CMainFrame*)AfxGetMainWnd())->nCreateAlbum(
> pdi->item.pszText );
> 				
> 				// Change the item's label.
> 				if( bRet )
> 					((CListCtrl*)GetDlgItem( wParam
> ))->SetItemText( pdi->item.iItem,
> 0, pdi->item.pszText );
> 			}
> 		}
> 		break;
> 
> 	default:
> 			phdr = NULL;
> 		break;
> 	}
> 
> 	
> 	return CDialogBar::OnNotify(wParam, lParam, pResult);
> }
> -----From: "Alcocer,Wagner" 
> 
> Add the LBS_NOTIFY style to the CListCtrl
> 
> >----------
> >From: 	Gerry Sweeney[SMTP:gerry@hornbill.com]
> >Sent: 	Tuesday, March 11, 1997 5:52 AM
> >To: 	mfc-l
> >Subject: 	CListCtl Question
> >
> >
> >Environment: NT3.51 SP3, MSVC20, MFC
> >
> >Dear Listers,
> >
> >I have implemented a CListCtrl inside a view. I seem to be unable to get
a
> >notification from the list box when I double-click on an item in the
list.
> >What I need is
> >
> >a) the double-click notification
> >b) the item that was double-clicked
> >
> >Any help would be appreciated
> >
> >
> >Kind Regards
> >
> >Gerry Sweeney
> >gerry@hornbill.com
> >
> >
> >
> >
> >
> >
> >
> -----From: Oksana Lien 
> 
> It's a two step process:
> 
> 1) Use notification message NM_DBLCLK in the view that contains the list
> control to catch the doubleclick;
> 2) While processing the double-click notification, use GetCurrentMessage()
> and HitTest() to get the index of the item that was double-clicked.
> 
> Here's what the code would look like:
> 
> BEGIN_MESSAGE_MAP(CYourView, CView)
>         ...
> 	//}}AFX_MSG_MAP
> 	ON_NOTIFY(NM_DBLCLK, yourListId, OnYourListDblclk)
> 	
> END_MESSAGE_MAP()
> 
> afx_msg void CYourView::OnYourListDblclk(NMHDR* pNMHDR, LRESULT* pResult)
> {
> 	const MSG* msg = GetCurrentMessage();
> 	int index;
> 	POINT pt = msg->pt;
> 
> 	ScreenToClient(&pt);
> 	if ((index = m_YourListCtrl.HitTest(pt, NULL)) > -1)
> 	{
>                 // Do whatevere you need to do with the selected item
> 	}
> }
> 
> 
> At 10:52 AM 3/11/97 G, you wrote:
> >
> >Environment: NT3.51 SP3, MSVC20, MFC
> >
> >Dear Listers,
> >
> >I have implemented a CListCtrl inside a view. I seem to be unable to get
a 
> >notification from the list box when I double-click on an item in the
list. 
> >What I need is
> >
> >a) the double-click notification
> >b) the item that was double-clicked
> >
> >Any help would be appreciated
> >
> >
> >Kind Regards
> >
> >Gerry Sweeney
> >gerry@hornbill.com
> >
> >
> >
> >
> >
> >
> >
> >
> _________________________
> Oksana Lien
> Dimension Softek, Inc.
> lien@ares.csd.net
> 
> -----From: ravi.swaminthan@midata.com (ravi swaminthan)
> 
> 
> Hi,
> 
> If u see the documentation for the CListCtrl notification message there   
> is no Double Click notification  Actually u can directly process the   
> LButtonDouble Click message of the CListCtrl. One of the parameters of   
> this message handler function is the point where the mouse is   
> clicked.From this point, the item on which the click was done can be   
> found using the CListCtrl function CListCtrl::HitTest which returns the   
> index to the clicked item.
> 
> Hope this answers your question.
> 
> I would like to know if your company's name is Hornbill Systems, based at
  
> Ruislip. London.
>    
> 
> You can reach me at
> Ravi.Swaminthan@midata.com
> (414)355 7637.
> 4363 W Dean Road, #258,
> Browndeer,Milwaukee
> Wisconsin, USA.
> 
>  ----------
> From:  owner-mfc-l[SMTP:owner-mfc-l@majordomo.netcom.com]
> Sent:  Tuesday, March 11, 1997 10:52 AM
> To:  mfc-l
> Subject:  CListCtl Question
> 
> 
> Environment: NT3.51 SP3, MSVC20, MFC
> 
> Dear Listers,
> 
> I have implemented a CListCtrl inside a view. I seem to be unable to get 
 
> a
> notification from the list box when I double-click on an item in the   
> list.
> What I need is
> 
> a) the double-click notification
> b) the item that was double-clicked
> 
> Any help would be appreciated
> 
> 
> Kind Regards
> 
> Gerry Sweeney
> gerry@hornbill.com
> 
> 
> 
> 
> 
> 
> 
> -----From: Amir Shoval 
> 
> Hi,
> 
> You can solve problem a) by handling WM_LBUTTONDBLCLK. In your
> handler, you can solve problem b) by calling your listCtrl.HitTest,
> passing the
> point you got in the handler. That's it.
> 
> 	Amir
> 
> >----------
> >From: 	Gerry Sweeney[SMTP:gerry@hornbill.com]
> >Sent: 	=E9=E5=ED =F9=EC=E9=F9=E9 11 =EE=F8=F5 1997 12:52
> >To: 	mfc-l
> >Subject: 	CListCtl Question
> >
> >
> >Environment: NT3.51 SP3, MSVC20, MFC
> >
> >Dear Listers,
> >
> >I have implemented a CListCtrl inside a view. I seem to be unable to =
> get a
> >notification from the list box when I double-click on an item in the =
> list.
> >What I need is
> >
> >a) the double-click notification
> >b) the item that was double-clicked
> >
> >Any help would be appreciated
> >
> >
> >Kind Regards
> >
> >Gerry Sweeney
> >gerry@hornbill.com
> >
> >
> >
> >
> >
> >
> >






Become an MFC-L member | Вернуться в корень Архива |