0

いくつかのデータを含むリストコントロールがあり、列を編集できる必要があります(列はほとんどありませんが、編集できるのはそのうちの1つだけです)。また、何らかの方法でこの列から複数の行をコピーできる必要があり、また、クリップボードからデータを挿入 (貼り付け) します。最小限の労力でその機能を有効にすることは可能ですか? ありがとうございました。

更新: ファイルを編集するための解決策を見つけましたが、奇妙に動作します。ここに記事があります http://www.codeproject.com/Articles/1124/Editing-Sub-Items-in-List-Control

著者の例ではかなりうまく機能しますが、タブ付きプロジェクト用に作り直そうとすると、編集ボックスの表示が正しくなくなりました。これはタブ付きダイアログの座標に関連していますが、まだ修正方法がわかりません。

ここに画像の説明を入力

4

1 に答える 1

1

あなたが参照している記事にはいくつかの問題があります。この記事の後のディスカッション投稿を見ると、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がリスト コントロール項目の座標をダイアログの座標空間に変換するためのものです。また、編集ボックスの周りに四角形を描画することもコメントアウトしました。これは、値を追加しないように見えるためです。

于 2015-06-25T19:48:56.273 に答える