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

Edit List control data in MFC (edit lines, copy & paste)

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

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

以作者为例,它工作得很好,但是当我试图为我的选项卡式项目重新制作它时,我得到了一个不正确的编辑框显示,它与选项卡式对话框坐标有关,但我仍然不知道如何修复它.

您引用的文章有一些问题。如果您查看文章后的讨论帖子,您会注意到一些评论表明 CEdit 控件的放置存在问题。特别是寻找 "CEdit placement error"。更重要的是,如果您查看已发布的代码,您将看到对 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将列表控件项的坐标转换为对话框的坐标space。我还注释掉了在编辑框周围绘制矩形,因为它似乎没有增加任何值。