あなたが参照している記事にはいくつかの問題があります。この記事の後のディスカッション投稿を見ると、CEdit コントロールの配置に関する問題を示すコメントがいくつかあることに気付くでしょう。特に、「CEdit 配置エラー」を探します。さらに重要なことは、投稿されたコードを見ると、 SetWindowPosコマンドにハード コードされた調整が行われていることがわかります。調整をハードコードすることは決して良い考えではありません。可能であれば、常に動的に計算する必要があります。
コードを 1 行追加し、ハードコードされた調整を削除することで、配置の問題を修正することに成功しました。以下の私のコードを参照してください。
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がリスト コントロール項目の座標をダイアログの座標空間に変換するためのものです。また、編集ボックスの周りに四角形を描画することもコメントアウトしました。これは、値を追加しないように見えるためです。