0

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

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

使用作者的示例,它工作得很好,但是当我尝试为我的选项卡式项目重新制作它时,我得到了一个不正确的编辑框显示,它与选项卡式对话框坐标有关,但我仍然无法弄清楚如何修复它。

在此处输入图像描述

4

1 回答 1

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将列表控件项的坐标转换为对话框的坐标空间。我还注释掉了在编辑框周围绘制矩形,因为它似乎没有添加任何值。

于 2015-06-25T19:48:56.273 回答