MFC 消息问题,求高手指教

easybf 2011-08-08 04:47:20
我在Dialog中加入一个ListCtrl(report),ListCtrl中加了一个edit编辑框,做成可以编辑修改除第一列外的所有列。

NM_DCLICK消息就是在ListCtrl中双击某个列项,进入编辑状态。

为了保存修改,我用了NM_CLICK消息映射一个函数,在里面添加我的保存代码。但是却没有能够保存。

又试了WM_LBUTTONDOWN消息,用这个消息却能实现我想要的功能。

但是用WM_LBUTTONDOWN消息,做出来的东西操作起来就太麻烦了啊。

求高手指点是什么问题。
...全文
119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
easybf 2011-08-09
  • 打赏
  • 举报
回复
分数有限,谢谢各位了
easybf 2011-08-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 visualeleven 的回复:]
引用 4 楼 visualeleven 的回复:

你应该子类话CEdit编辑框,处理WM_MOUSEHOVER,WM_MOUESLEAVE消息

Sorry,这个有个问题,鼠标离开了就会进入WM_MOUSELEAVE中。还是在CListCtrl中的WM_LBUTTONDOWN吧
[/Quote]

最后我还是用了ListCtrl中的NM_CLICK消息。改了一下用来保存修改的代码
void CxmllistDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{

CWnd* pwndCtrl = GetFocus();
// 得到目前焦点所在控件的ID
int ctrl_ID = pwndCtrl->GetDlgCtrlID();
CString str;
switch (ctrl_ID)
{ //如果控件是Edit box
case IDC_EDIT1:

GetDlgItemText(IDC_EDIT1,str);

SetCell(::GetDlgItem (m_hWnd,IDC_LIST1),str,nItem,nSubItem);
::SendDlgItemMessage(m_hWnd,IDC_EDIT1,WM_KILLFOCUS,0,0);
::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);
break;
default:
break;
}

*pResult = 0;
}



void CxmllistDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CWnd* pwndCtrl = GetFocus();

int ctrl_ID = pwndCtrl->GetDlgCtrlID();
CString str;
switch (ctrl_ID)
{
case IDC_EDIT1:

GetDlgItemText(IDC_EDIT1,str);

SetCell(::GetDlgItem (m_hWnd,IDC_LIST1),str,nItem,nSubItem);
::SendDlgItemMessage(m_hWnd,IDC_EDIT1,WM_KILLFOCUS,0,0);
::ShowWindow(::GetDlgItem(m_hWnd,IDC_EDIT1),SW_HIDE);
break;
default:
break;
}


CDialog::OnLButtonDown(nFlags, point);
}
这是分别在NM_CLICK 和 WM_LBUTTONDOWN中的代码。
void CxmllistDlg::SetCell( HWND hWnd1, CString value, int nRow, int nCol )
{
TCHAR szString [256];
wsprintf(szString,value ,0);
LVITEM lvItem;
lvItem.mask = LVIF_TEXT;
lvItem.iItem = nRow;
lvItem.pszText = szString;
lvItem.iSubItem = nCol;
if(nCol >0)
::SendMessage(hWnd1,LVM_SETITEM, (WPARAM)0,(WPARAM)&lvItem);
else
ListView_InsertItem(hWnd1,&lvItem);
}
这是自定义的SetCell用来对ListCtrl插入项的。和setItemText的作用相同。
最后我们总监让我把NM_CLICK中的代码改成
CListCtrl* ctl=(CListCtrl*)GetDlgItem(IDC_LIST1);
if(ctl)
{
ctl->SetItemText(nItem,nSubItem,str);
}
就好了。
至于为什么我写的只能在wM_LBUTTONDOWN中实现我还没弄明白。
  • 打赏
  • 举报
回复
你可以到codeproject上找找类似的
quwei197874 2011-08-08
  • 打赏
  • 举报
回复
接分来了
Eleven 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 visualeleven 的回复:]

你应该子类话CEdit编辑框,处理WM_MOUSEHOVER,WM_MOUESLEAVE消息
[/Quote]
Sorry,这个有个问题,鼠标离开了就会进入WM_MOUSELEAVE中。还是在CListCtrl中的WM_LBUTTONDOWN吧
Eleven 2011-08-08
  • 打赏
  • 举报
回复
你应该子类话CEdit编辑框,处理WM_MOUSEHOVER,WM_MOUESLEAVE消息
easybf 2011-08-08
  • 打赏
  • 举报
回复
回复2楼:不是我不想描述好,只是那个问题让我自己都没办法组织出好的描述语言,是在抱歉
qjgdftxmu 2011-08-08
  • 打赏
  • 举报
回复
像你这种对问题的描述方法,估计也只能自己解决了
easybf 2011-08-08
  • 打赏
  • 举报
回复
问题已经解决。

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧