2015-06-23 59 views
0

我有一些數據的列表控件,我需要能夠編輯列(我有幾列,但只有其中一個應該是可編輯的),我也需要能夠以某種方式複製此列中的多行,並將剪貼板中的數據(粘貼)。這可能以最小的努力啓用這些功能嗎?謝謝。在MFC中編輯列表控制數據(編輯行,複製和粘貼)

更新:我發現解決方案的編輯提交,但它奇怪。這裏的文章http://www.codeproject.com/Articles/1124/Editing-Sub-Items-in-List-Control

與作者的例子它工作得很好,但是當我試圖重拍它爲我的選項卡項目我得到了一個不正確的編輯框顯示,它與標籤對話框座標有關,但我仍然無法弄清楚如何要解決這個問題。

enter image description here

+0

聽起來像你有多個問題。您最關心的是什麼,並且可以顯示您正在使用的相關代碼? – rrirower

+0

我的目標是讓列表能夠複製/粘貼數據和編輯單元格,我已經複製了文章中的所有代碼,但它的工作原理很奇怪,正如我所說的。也許我只是在錯誤的方向前進,但沒有太多有用的文章,我發現谷歌。 –

回答

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到列表控制項的座標轉換爲對話框的座標空間。我也評論過在編輯框周圍繪製矩形,因爲它似乎沒有增加任何值。

+0

是的,這真的讓它工作,因爲它應該,謝謝。 –

相關問題