MFC ListCtrl 컨트롤 몇가지 처리방법
MFC&ActiveX 2007. 11. 27. 00:28 |ListCtrl의 한줄로 선택되도록 처리 하는 방법 + 그리드 라인을 같이 그려주는 코드
생성시에 한번 호출해서 설정해 주면 됩니다.
컬럼 설정하는 방법
// 리스트 컬럼 추가함수
void CDlgSequencePage::AddColumn()
{
//컬럼 채우기
int m_nColWidths[] = { 90, 60}; // sixty-fourths
TCHAR * lpszHeaders[] = {
_T("Port/Sequence"),
_T("Address"),
NULL };
int i;
LV_COLUMN lvcolumn;
memset(&lvcolumn, 0, sizeof(lvcolumn));
// add columns
for (i = 0; ; i++) {
if (lpszHeaders[i] == NULL)
break;
lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT | LVCF_WIDTH;
lvcolumn.fmt = LVCFMT_LEFT;
lvcolumn.pszText = lpszHeaders[i];
lvcolumn.iSubItem = i;
lvcolumn.cx = m_nColWidths[i];
m_listPortSequencePerAddress.InsertColumn(i, &lvcolumn);
}
}
데이터 추가시
Lparam도 같이 추가할 때
void CDlgSequencePage::AddData(CString portName, int Address, lpFixtureElement pFixEle)
{
CString strText;
int index = 0;
index = m_listPortSequencePerAddress.GetItemCount();
// Insert the item, select every other item.
strText = portName;
int id = m_listPortSequencePerAddress.InsertItem(LVIF_TEXT|LVIF_PARAM, index, strText, 0, 0, 0, (LPARAM)pFixEle);
// Insert 10 items in the list view control.
strText.Format(TEXT("%d"), Address);
m_listPortSequencePerAddress.SetItemText(index, 1, strText);
}
해당 Row를 선택시에 Lparam의 값을 가져와서 처리 하는 방법
void CDlgSequencePage::OnLvnItemchangedSequenceListInfo(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
static int oldSelectItemLine = -1;
// 해당 아이템 번호가 항상 3번 호출되고 다른 번호가 들어오기 때문에
// 여기서 걸러 준다.
if(pNMLV->iItem != oldSelectItemLine) {
oldSelectItemLine = pNMLV->iItem;
// 리스트 컨트롤에 저장된 포인터 정보를 사용해서
// 선택정보를 변경하자.
lpFixtureElement pFixEle = (lpFixtureElement)m_listPortSequencePerAddress.GetItemData(pNMLV->iItem);
ASSERT(pFixEle);
FixtureArray::GetInstance().ChangedFixtureElement(pFixEle);
// PixelMap View 화면을 업데이트 한다.
g_PixelMapView->Invalidate();
}
*pResult = 0;
}