이야기 할까 합니다.
CListCtrl 에서 컬럼을 에디팅 가능하게 하기 위해서는 LVS_EDITLABELS 컨트롤 생성시 스타일 값에 추가 하셔야 합니다.
아래와 같이 코드로 생성할때는 아래와 같이 처리 하고요.
DWORD dwStyle = WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | LVS_EDITLABELS; m_pListCtrl->Create(dwStyle, CRect(0,0,200,200), this, 1001);
리소스로 추가 하셨으면
아래의 프로퍼티 속성창에서 "Edit Labels" 를 True 속성으로 변경합니다.
다음 에디트가 활성화 되었을때 변경된 값을 핸들링 하기 위해서 CListCtrl을 가지고 있는 CWnd 기반에서 윈도우에서
아래 두가지 이벤트를 추가 합니다.
ON_NOTIFY(LVN_BEGINLABELEDIT, 1001, OnLvnBeginlabeledit) ON_NOTIFY(LVN_ENDLABELEDIT, 1001, OnLvnEndlabeledit)
물론 함수도 추가 해야겠지요.
헤더에 아래와 같이 추가.
afx_msg void OnLvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnLvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult);
Cpp 파일에
void CDialogTest::OnLvnBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult) { if (m_pListCtrl == NULL) return; NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR); TRACE(_T("Begin ListCtrl Edit %d\n"), pDispInfo->item.iItem); *pResult = 0; } void CDialogTest::OnLvnEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult) { if (m_pListCtrl == NULL) return; NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR); if (pDispInfo->item.pszText != NULL) { TRACE(_T("End ListCtrl Edit %d(%s)\n"), pDispInfo->item.iItem, pDispInfo->item.pszText); m_pListCtrl->SetItemText(pDispInfo->item.iItem, pDispInfo->item.iSubItem, pDispInfo->item.pszText); } else { TRACE(_T("End ListCtrl Edit %d(Cancel)\n"), pDispInfo->item.iItem); } *pResult = 0; }
만약에 CListCtrl 에 아이템을 추가 하자 마자 에디팅 되게 모드를 바꾸시려면 아래와 같이 하시면 됩니다.
int nNew = m_pListCtrl->InsertItem(m_pListCtrl->GetItemCount(), _T(""), 0); m_pListCtrl->SetFocus(); m_pListCtrl->EditLabel(nNew);
보통은 CListCtrl 컨트롤을 오버라이딩 하셔서 구현한 사례가 많아 오버라이딩 하지 않아도 쓸수 있는 방법을 설명해 보았습니다.
그럼 ^^
댓글 없음:
댓글 쓰기