在MFC中编辑列表控件数据(编辑行,复制和粘贴)

时间:2015-06-23 05:32:49

标签: visual-c++ mfc clistctrl listcontrol

我有一个包含一些数据的列表控件,我需要能够编辑列(我有几列,但只有一列应该是可编辑的),我还需要能够以某种方式从中复制多行此列还可以从剪贴板中放入数据(粘贴)。这可以用最少的努力来实现这些功能吗?谢谢。

更新:我找到了编辑文件的解决方案,但它很奇怪。这是文章http://www.codeproject.com/Articles/1124/Editing-Sub-Items-in-List-Control

以作者为例,它的效果非常好,但是当我尝试为我的标签项目重新制作时,我得到了一个不正确的编辑框显示,它与选项卡式对话框坐标相关,但我仍然无法弄清楚如何修复它。 / p>

enter image description here

1 个答案:

答案 0 :(得分:1)

您引用的文章存在一些问题。如果您查看本文后面的讨论帖子,您会注意到一些注释表明CEdit控件的放置存在问题。特别是,查找“CEdit放置错误”。更重要的是,如果您查看已发布的代码,您将看到 SetWindowPos 命令的硬编码调整。硬编码调整绝不是一个好主意。如果可能,应始终动态计算它们。

通过添加一行代码并删除硬编码调整,我成功地修复了定位问题。请参阅下面的代码。

RECT rect1, rect2;
// this macro is used to retrieve the Rectanle 
// of the selected SubItem
ListView_GetSubItemRect(hWnd1, temp->iItem,
    temp->iSubItem, LVIR_BOUNDS, &rect);
::MapWindowPoints(hWnd1, m_hWnd, reinterpret_cast<LPPOINT>(&rect), 2);

//Get the Rectange of the listControl
::GetWindowRect(temp->hdr.hwndFrom, &rect1);
//Get the Rectange of the Dialog
::GetWindowRect(m_hWnd, &rect2);    

int x = rect1.left - rect2.left;
int y = rect1.top - rect2.top;

if (nItem != -1)
    ::SetWindowPos(::GetDlgItem(m_hWnd, IDC_EDIT1),
    HWND_TOP, rect.left, rect.top,
    rect.right - rect.left,
    rect.bottom - rect.top, NULL);

::ShowWindow(::GetDlgItem(m_hWnd, IDC_EDIT1), SW_SHOW);
::SetFocus(::GetDlgItem(m_hWnd, IDC_EDIT1));
//Draw a Rectangle around the SubItem
//::Rectangle(::GetDC(temp->hdr.hwndFrom),
//  rect.left, rect.top, rect.right, rect.bottom);
//Set the listItem text in the EditBox
::SetWindowText(::GetDlgItem(m_hWnd, IDC_EDIT1), str);

我添加的行是 MapWindowPoints ,用于将列表控件项的坐标转换为对话框的坐标空间。我还注释了在编辑框周围绘制矩形,因为它似乎没有添加任何值。