저는 MFC에서 폼베이스로 작업할때 주로 리소스 창에서 컨트롤 대충 그려넣고
서브클래싱할 클래스 하나씩 만들어주고
컨트롤 클래스의 SubClassDlgItem() 함수를 이용해서 서브클래싱합니다.
오늘 아주 간단한 리스트컨트롤을 클릭하면 세부내용을 다른 에디트 컨트롤에
뿌려주는 부분을 작성했습니다.
서브클래싱한 컨트롤의 OnClick을 잡고서 아래와 같이 코딩했습니다.

void CSMSList::OnClick(NMHDR* pNMHDR, LRESULT* pResult) 
{
    // TODO: Add your control notification handler code here
    NM_LISTVIEW *pList = (NM_LISTVIEW*)pNMHDR;
    int nIndex = pList->iItem;
    *pResult = 0;
}


분명히 리스트에서 클릭한 아이템의 인덱스를 가져와야 하는데 이상하게 자꾸 -1로
나오더군요.. ㅠㅠ

그러다 알아냈습니다.
네~~~ 맞습니다. 결국 또 저에 실수 입니다.

서브클래싱한 컨트롤의 PreSubclassWindow() 에서 아래와 같이 코딩해주니 바로 해결
됬습니다.

void CSMSList::PreSubclassWindow() 
{
    // TODO: Add your specialized code here and/or call the base class
    SetExtendedStyle(LVS_EX_FULLROWSELECT);
    CListCtrl::PreSubclassWindow();
}



PreSubclassWindow() 함수는 SubClassDlgItem()으로 서브클래싱 했을때 초기화 해주는
멤버 함수입니다.
SetExtendedStyle() 함수는 확장 스타일 함수로 LVS_EX_FULLROWSELECT를 인자로
클릭시 리스트 한줄전체(Row)가 선택되어 집니다.

위와 같이 코딩했더니 OnClick함수에서 제대로 인텍스를 얻어왔습니다.
아~!! 오늘도 하나 실수했고 한가지 배웠습니다.

posted by 뚱2