一个小问题,关于可编辑SubItemr的CListCtrl

kenskens 2006-04-03 11:17:34
采用子类化Edit控件,将其移动到命中的SubItem上方进行编辑的方法,但出了点小问题,主要代码如下:
void CFlashIO3Dlg::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
NMITEMACTIVATE *pLSV = (NMITEMACTIVATE*)pNMHDR;
if( (pLSV->iItem != -1) && (pLSV->iSubItem != 0) ) // 命中某子项
{
m_iItem = pLSV->iItem; // 保存命中子项的位置
m_iSubItem = pLSV->iSubItem;
m_lsvTest.EditLabel(m_iItem);
}

*pResult = 0;
}

void CFlashIO3Dlg::OnBeginlabeleditList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
if(pDispInfo->item.iItem != -1)
{
ASSERT(m_iItem == pDispInfo->item.iItem);

HWND hEdit = (HWND)m_lsvTest.SendMessage(LVM_GETEDITCONTROL);
ASSERT(hEdit != NULL);
VERIFY(m_edtSub.SubclassWindow(hEdit)); // 子类化控件

CRect rect; // 获取命中子项的坐标
m_lsvTest.GetSubItemRect(m_iItem, m_iSubItem, LVIR_BOUNDS, rect);

// m_edtSub为CSubEdit类对象
m_edtSub.m_x = rect.left + 2; // Edit将出现在命中SubItem的上方 m_edtSub.m_cx = rect.Width()-2;
// 将SubItem内容显示到Edit中供编辑
m_edtSub.SetWindowText(m_lsvTest.GetItemText(m_iItem, m_iSubItem));
*pResult = 0; // 允许编辑
}
else
{
*pResult = 1; // 禁止编辑
}
}

void CFlashIO3Dlg::OnEndlabeleditList1(NMHDR* pNMHDR, LRESULT* pResult)
{
LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
if(pDispInfo->item.iItem != -1)
{
ASSERT(pDispInfo->item.iItem == m_iItem);

if(pDispInfo->item.pszText != NULL)
{ // 设置编辑结果至SubItem
m_lsvTest.SetItemText(m_iItem, m_iSubItem, pDispInfo->item.pszText);
m_edtSub.UnsubclassWindow();
*pResult = 0; // 恢复第0子项
}
}
else
{
*pResult = 1; // 将编辑应用于第0子项
}

m_iItem = -1;
m_iSubItem = -1;
}

void CSubEdit::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{
lpwndpos->x = m_x; // 移动Edit至SubItem处
lpwndpos->cx = m_cx;

CEdit::OnWindowPosChanging(lpwndpos);

// TODO: Add your message handler code here
}

现在的问题是当开始编辑SubItem(非0)时,SubItem 0 上的文字消失了,等编辑完成或取消后才恢复显示,我觉得这可能是Edit被移走后,SubItem 0没有重绘的原因吧,但不敢确定,请教高手这是为什么,该怎么解决呢?
...全文
380 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
livedeal 2006-04-10
  • 打赏
  • 举报
回复
留底,学习
captainliyun 2006-04-10
  • 打赏
  • 举报
回复
有没有E_MAIL.给你一份代码
taole0160 2006-04-06
  • 打赏
  • 举报
回复
加上这个
void CV2::OnPaint()
{
// CPaintDC dc(this); // device context for painting


// TODO: Add your message handler code here
if (m_subitem)
{
CRect rect;
CRect editrect;

GetListCtrl().GetSubItemRect(m_item1,m_subitem,LVIR_LABEL ,editrect);

m_editWnd.GetWindowRect(editrect);
ScreenToClient(editrect);

//block text redraw of the subitems text (underneath the editcontrol)
//if we didn't do this and deleted some text in the edit control,
//the subitems original label would show
if (editrect.right < rect.right)
{
rect.left = editrect.right ;
ValidateRect(rect);
}

//block filling redraw of leftmost item (caused by FillRect)
GetListCtrl().GetItemRect(m_item1,rect,LVIR_LABEL );
ValidateRect(rect);
}

CListView::OnPaint();
// Do not call CListView::OnPaint() for painting messages
}
klabc 2006-04-04
  • 打赏
  • 举报
回复
为什么要使用MFC为你创建那个edit控件呢?你在调用EditLabel的时候,MFC认为用户要编辑0 subitem的那个项,所以在那个位置创建了一个CEdit控件,你移动那个控件会导致0 subitem显示不正常。

其实有更安全也更简单的办法来做。假如你想编辑2 subitem.
1.首先为dialog添加一个protected member, CEdit* m_pEdit; 初始化为null.
2.响应LVN_ITEMCHANGED消息
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_EDIT, OnItemchangedListEdit)

void CTT2Dlg::OnItemchangedListEdit(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 0;
int nItem = pNMListView->iItem;
int nSubItem = 2;
CRect rcSubItem;
m_editListctrl.GetSubItemRect(nItem, 2, LVIR_BOUNDS, rcSubItem);

if ( (pNMListView->uOldState & LVIS_SELECTED) && !(pNMListView->uNewState & LVIS_SELECTED) )
{//This item is de-selected.
TRACE(_T("Item %d is de-selected\n"), nItem);
if (NULL != m_pEdit)
{
CString cs;
m_pEdit->GetWindowText(cs);
m_editListctrl.SetItemText(nItem, 2, cs);
m_pEdit->ShowWindow(SW_HIDE);
}
m_editListctrl.InvalidateRect(rcSubItem);
return;

}
if ( !(pNMListView->uOldState & LVIS_SELECTED) && (pNMListView->uNewState & LVIS_SELECTED) )
{
TRACE(_T("Item %d is selected\n"), nItem);
if (NULL == m_pEdit)
{
m_pEdit = new CEdit;
m_pEdit->Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP,
rcSubItem, &m_editListctrl, 0x10);
ASSERT(m_pEdit->GetSafeHwnd());
}
m_pEdit->SetWindowText( m_editListctrl.GetItemText(nItem, nSubItem) );
m_pEdit->ShowWindow(SW_SHOW);
m_pEdit->MoveWindow(rcSubItem);

m_editListctrl.InvalidateRect(rcSubItem);
return;
}
}
goodboyws 2006-04-03
  • 打赏
  • 举报
回复
OnWindowPosChanging去掉应该就可以了,出现空白的原因就是Edit出现时被你移到了错误的位置
内容概要:本文研究了基于二阶线性自抗扰控制器(LADRC)的表贴式永磁同步电机(PMSM)双闭环矢量调速系统,重点在于通过Simulink搭建仿真模型,实现对PMSM的速度和电流双环控制。文中系统阐述了LADRC的核心原理及其在估计并补偿系统内部动态与外部扰动方面的优越性,相较于传统PI控制,LADRC显著提升了系统的动态响应速度、抗干扰能力和鲁棒性。研究构建了完整的矢量控制体系,涵盖了Park与Clarke坐标变换、空间矢量脉宽调制(SVPWM)技术、转速环与电流环的协同设计,并通过大量仿真实验,全面验证了所提出控制策略在启动过程、突加/突卸负载以及电机参数摄动等多种工况下的卓越性能表现。; 适合人群:自动化、电气工程、控制科学与工程及相关专业的研究生、高校科研人员及从事高性能电机驱动与控制算法开发的工程师。; 使用场景及目标:①深入理解自抗扰控制(ADRC)理论在高精度电机驱动系统中的具体应用与实现方法;②掌握基于Simulink/MATLAB的PMSM矢量控制系统从理论建模到仿真实现的全流程技术;③学习并掌握LADRC控制器的参数整定规律与优化技巧,提升解决实际工程中强扰动、非线性问题的能力;④为研发具有更高鲁棒性和控制精度的工业级电机控制系统提供先进的技术方案与理论依据。; 阅读建议:建议读者结合所提供的Simulink仿真模型进行同步学习与实践,重点关注扩张状态观测器(ESO)的带宽配置、控制器参数与系统性能之间的内在关系,并可通过修改负载条件和电机参数来测试系统的鲁棒性,为进一步研究非线性ADRC或将其应用于其他复杂机电系统奠定坚实基础。

15,976

社区成员

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

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