2020년 2월 5일 수요일

VisualStudio 2017 Properties MFC Class 정보 누락

Visaul Studio 2017 을 사용중에 MFC Class 로 소스를 생성하고 작업중에

Properties 창에서 헤더 파일의 클래스를 클릭하면 해당 되는 이벤트 override 정보등이 나와야 하는데

나오지 않았다.


찾아 보니  C/C++ 설정창에서 기본으로 안보이게 설정이 되어 있었다.

다시 나오게 설정을 하려면.

메뉴  → Tools → Option → Text Editor → C/C++ → Advanced 에서.

"Disable Current Selection" 항목이 true 로 되어 있을건데 이것을 false 로 해주면 된다.

MFC CListCtrl Edit Label 적용

MFC CListCtrl 컨트롤 직접 생성하여 사용할때 특정 컬럼을 에디팅 하여 사용할때 처리하는 방법을
이야기 할까 합니다.

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 컨트롤을 오버라이딩 하셔서 구현한 사례가 많아 오버라이딩 하지 않아도 쓸수 있는 방법을 설명해 보았습니다.
그럼 ^^