你引用的文章有一些问题。如果您查看文章之后的讨论帖子,您会注意到一些评论表明 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将列表控件项的坐标转换为对话框的坐标空间。我还注释掉了在编辑框周围绘制矩形,因为它似乎没有添加任何值。