在 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。我还注释掉了在编辑框周围绘制矩形,因为它似乎没有增加任何值。
我有一个包含一些数据的列表控件,我需要能够编辑列(我的列很少,但只有其中一列应该是可编辑的),我还需要能够以某种方式复制多个此列中的行,还从剪贴板中放置数据(粘贴)。是否有可能以最少的努力启用该功能?谢谢。
更新:我找到了编辑归档的解决方案,但效果很奇怪。这是文章 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。我还注释掉了在编辑框周围绘制矩形,因为它似乎没有增加任何值。