LIST控件双击出现编辑框

 

首先要响应通知消息事件:NM_DBLCLK                  NM_CLICK

双击 出现编辑框         单击 保存

 

 

void CxmlEditDlg::OnNMDblclkListXml(NMHDR *pNMHDR, LRESULT *pResult)
{

	//------------------
    Invalidate();
	LPNMITEMACTIVATE pNMItemActivate  =  reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR);

	LVHITTESTINFO info;
	info.pt  =  pNMItemActivate -> ptAction;

	if (m_xmlListControl.SubItemHitTest( & info)  !=   - 1  )
	{
		nhitRow  =  info.iItem;
		nhitCol  =  info.iSubItem;

		if (m_edit.m_hWnd  ==  NULL) // editItem为一输入框控件, 
		{
			RECT rect;
			rect.left  =   0 ;
			rect.top  =   0 ;
			rect.bottom  =   15 ;
			rect.right  =   200 ;
			m_edit.Create(WS_CHILD  |  ES_RIGHT  |  WS_BORDER  |  ES_AUTOHSCROLL  |  ES_WANTRETURN  |  ES_MULTILINE, rect,  this ,  101 );
			GetDlgItem(IDC_EDIT1)->SetFont( this -> GetFont(), FALSE);
		}
		CRect rect;
		m_xmlListControl.GetSubItemRect(info.iItem, info.iSubItem, LVIR_BOUNDS, rect);
		int iSubItemWidth = m_xmlListControl.GetColumnWidth(nhitCol);
		rect.top  +=   14 ;
		rect.left  +=   15 ;

		rect.right  =   rect.left+iSubItemWidth ;

		rect.bottom  +=   14 ;

		GetDlgItem(IDC_EDIT1)->SetWindowText(m_xmlListControl.GetItemText( info .iItem,  info .iSubItem));
		GetDlgItem(IDC_EDIT1)->MoveWindow( & rect, TRUE);
		GetDlgItem(IDC_EDIT1)->ShowWindow( 1 );
		GetDlgItem(IDC_EDIT1)->SetFocus();
	}
	m_iLastState = VALUE_EDIT;
	* pResult  =   0 ;

}


 

 

void CxmlEditDlg::OnNMClickListXml(NMHDR *pNMHDR, LRESULT *pResult)
{
	
	LPNMITEMACTIVATE pNMItemActivate  =  reinterpret_cast < LPNMITEMACTIVATE > (pNMHDR);

	LVHITTESTINFO info;
	info.pt  =  pNMItemActivate -> ptAction;

	if (m_iLastState == VALUE_EDIT)
	{
		
		if (m_xmlListControl.SubItemHitTest( & info)  !=   - 1  )
		{
			int hitRow  =  info.iItem;
			int hitCol  =  info.iSubItem;
			if (hitRow == nhitRow&&hitCol == nhitCol)
			{
				return;
			}
		}
		
		if (m_edit.m_hWnd  !=  NULL)
		{
			m_edit.ShowWindow( 0 );
			if (nhitRow  !=   - 1 )
			{
				CString text;
				m_edit.GetWindowText(text);

				m_iLastState = VALUE_REGULAR;

				m_xmlListControl.SetItemText(nhitRow, nhitCol, text);
			}
		}
		nhitCol  =  nhitRow  =   - 1 ;
		
	}
	
	* pResult  =   0 ;
}


 

MFC是Microsoft Foundation Classes的缩写,是微软为了简化Windows编程而开发的一套C++类库。ListCtrl是MFC中的一个控件,用于显示和编辑数据的列表。 要在MFC中实现可编辑的ListCtrl控件,可以按照以下步骤进行操作: 1. 在对话框资源中添加一个ListCtrl控件,并设置其属性,如样式、列数等。可以使用控件向导来简化这一过程。 2. 在对话框类的头文件中声明一个ListCtrl对象,用于对控件进行操作。例如,在CDialog派生类中添加如下成员变量: ```cpp CListCtrl m_listCtrl; ``` 3. 在OnInitDialog函数中获取ListCtrl控件的指针,并进行初始化操作。例如: ```cpp m_listCtrl.SubclassDlgItem(IDC_LISTCTRL, this); //将控件与IDC_LISTCTRL关联起来 m_listCtrl.InsertColumn(0, _T("列1"), LVCFMT_LEFT, 100); //插入列 ``` 4. 通过ListCtrl对象的成员函数,可以实现对控件中的数据进行操作。例如,添加一行数据的代码如下: ```cpp m_listCtrl.InsertItem(0, _T("数据1")); //在第0行插入一行数据 m_listCtrl.SetItemText(0, 1, _T("数据2")); //设置第0行、第1列的数据 ``` 5. 若要实现可编辑功能,可以通过响应鼠标双击、单击或其他事件,在合适的位置进行编辑操作。例如,在双击某一项时弹出对话框进行编辑: ```cpp int index = m_listCtrl.GetSelectionMark(); //获取当前选中的项 CString data = m_listCtrl.GetItemText(index, 1); //获取选中项的数据 CEditDialog editDlg; //自定义的对话框类 editDlg.m_editCtrl.SetWindowText(data); //将数据显示在对话框的编辑框中 if (editDlg.DoModal() == IDOK) { CString newData; editDlg.m_editCtrl.GetWindowText(newData); //获取对话框中编辑框的数据 m_listCtrl.SetItemText(index, 1, newData); //更新ListCtrl控件中的数据 } ``` 通过以上步骤,就可以实现在MFC中可编辑的ListCtrl控件。需要注意的是,在实际应用过程中可能还需要处理其他事件、进行数据校验等操作,具体实现可根据需求进行扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值