minjeong-oh
기록
minjeong-oh
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • ML & Neural Net (3)
    • ◼️GNN (1)
    • ◼️시계열 (1)
    • ◼️추천시스템 (0)
    • ◼️수학 (3)
    • Data Engineer (2)
    • ◼️Spark (1)
    • ◼️Kafka (1)
    • ◼️Elestic Search (0)
    • ◼️Redis (0)
    • ◼️ClickHouse (1)
    • Programming Language (4)
    • ◼️셸 스크립트 (0)
    • ◼️SQL (0)
    • ◼️React (0)
    • ◼️Git (1)
    • ◼️Python (1)
    • ◼️C++ (33)
    • ◼️Fortran 99 (2)
    • ◼️OpenGL (7)
    • ◼️MFC (35)
    • ◼️Flutter (46)
    • ◼️Kotlin (1)
    • ◼️Android (1)
    • ◼️Java (1)
    • ◼️C (4)
    • Development (0)
    • ◼️디자인패턴 (0)
    • ◼️네트워크 (2)
    • ◼️인증 (1)
    • Computer Science (4)
    • 알고리즘 문제풀이 (12)
    • SQL 고득점 Kit 문제풀이 (8)
    • 취업준비 (0)
    • Notion 정리 글 (1)
    • Article Scrap (12)
      • Careerly - Q&A (7)
      • Careerly - Post (2)
    • 기타 등등 (16)

블로그 메뉴

  • 글쓰기
  • 홈
  • 태그
  • 방명록
  • 편집

공지사항

인기 글

태그

  • 이것이C++이다책참고
  • 리눅스파티션
  • 19년식그램SSD장착
  • hello테마
  • 구조체배열포인터
  • 19년식그램램장착
  • AI배워야하나
  • OpenGL회전
  • NextJSSwagger
  • 이차원구조체배열포인터
  • 구조체매개변수
  • 그램업그레이드
  • kafka구축
  • API문서정리
  • GSLB
  • 인공지능개발자
  • mfc
  • SpringBootSwagger
  • 그램풀스팩업그레이드
  • 티스토리폰트배경색없애기

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
minjeong-oh

기록

◼️MFC

[MFC] CListCtrl 팁

2022. 10. 10. 15:40

1. CListCtrl 모든 선택 표시 해제

2. CListCtrl 원하는 항목을 리스트의 최상단에 위치 시킨다. SetTopIndex()

3. CListCtrl 현재 클릭한 셀 index 얻기

4. CListCtrl의 row text 길이에 맞춰서 셀의 가로길이가 자동설정 되도록함

5. CListCtrl 이전 스크롤위치 유지하기

6. CListCtrl에서 item이 selected 된상태에서 header 클릭시 selected를 유지하고 select된 item의 위치에 맞춰서 scroll을 이동해줌

7. CListCtrl row 높이 설정

8. CListCtrl item 색상 변경

9. 특정 row 하이라이트 및 스크롤 위치 이동

10. 특정 컬럼을 삭제하고, 추가하기

 

1. CListCtrl 모든 선택 표시 해제

list.SetItemState(-1,0, LVIS_SELECTED);

 

 

2. CListCtrl 원하는 항목을 리스트의 최상단에 위치 시킨다. SetTopIndex()

 

Issue

CListCtrl에서는 GetTopIndex()라고 해서 현재 보여지고 있는 최상단의 index를 가져올수가 있지만.

원하는 항목을 Top에 위치시킬 수 있는 SetTopIndex() 는 제공되지 않고있다. 

 

Solution Process

CListCtrl의 EnsureVisible는 item을 현재 보여지는 창의 제일아래에 위치 시킬 수 있도록 한다.

제일 상단에 위치 시키고 싶기 때문에 보여지는 개수 만큼 위로 올려주면 된다.

 

CListCtrl에서 상단으로 위치시키고 싶은 item의 index를 알고 있다는 가정하의 코드 이다.

int viewSize = list.GetCountPerPage()-1;
list.EnsureVisible(wantItemIndex + viewSize, TRUE);

 

 

3. CListCtrl 현재 클릭한 셀 index 얻기

LPNMITEMACTIVATE pNMIA = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
int row = pNMIA->iItem;
int col = pNMIA->iSubItem;

 

 

4.  list의 row text 길이에 맞춰서 셀의 가로길이가 자동설정 되도록함

list.SetColumnWidth(i, LVSCW_AUTOSIZE_USEHEADER);

 

 

5. list에서 column Name을 선택했을 때 상단으로 이동하지 않도록 함 (데이터가 업데이트되면 상단으로 이동됨 -default)

int scrPos; //스크롤 위치를 저장해서 이전위치로 재설정하기위한 변수  (.h 에 선언)

//HDN_ITEMCLICK 이벤트 핸들러 함수에 해야함!

scrPos = con_list.GetScrollPos(SB_VERT);   //함수 첫부분에 위치를 저장해둠

//Data update code   //이때 위치가 0으로 설정돼서 상단으로 돌아가는 것임

CRect ref;
con_list.GetItemRect(0, ref, LVIR_BOUNDS);   // 한칸 높이 측정
CSize size(0, ref.Height() * scrPos);

con_list.Scroll(size);     //처음에 저장해둔 위치로 재설정

 

 

6.list에서 item이 selected 된상태에서 header 클릭시 selected를 유지하고 select된 item의 위치에 맞춰서 scroll을 이동해줌

POSITION pos = con_list.GetFirstSelectedItemPosition();
iNum = con_list.GetNextSelectedItem(pos);

//data update code   //이때 selected된 item의 상태가 초기화된다.

if (iNum >= 0)
{
	// 먼저 현재 선택상태를 해제합니다
	con_list.SetItemState(-1, 0, LVIS_SELECTED | LVIS_FOCUSED);
	// 원하는 아이템을 선택합니다
	con_list.SetItemState(iNum, LVIS_FOCUSED | LVIS_SELECTED, LVIS_FOCUSED | LVIS_SELECTED);
	// 선택된 아이템을 표시합니다
	con_list.EnsureVisible(iNum, false);
	// 리스트 컨트롤에 포커스를 맞춥니다
	con_list.SetFocus();

	POINT p;
	con_list.GetItemPosition(iNum, &p);   
	CSize sz(0, p.y - 155);  //item의 y축좌표를 기준으로 scroll의 위치를 설정한다.  -a 부분에서 a의 숫자가 클수록 아래로 스크롤 이동
	con_list.Scroll(sz); 
}

 

7. 리스트 row 높이 설정

CImageList imgGap;
imgGap.Create(1, 30, ILC_COLORDDB, 1, 0);     //두번째 인자로 (header를 제외한) row height 조절
con_list.SetImageList(&imgGap, LVSIL_SMALL);  
 
CFont font;
font.CreatePointFont(100, _T("Arial"));   //Font Size 설정  //Font사이즈에 맞춰서 height설정됨 (header  포함)
list.SetFont(&font);

(setStyle 하고난 후 header 설정해야함)
CHeaderCtrl * header = list.GetHeaderCtrl();   또는 (CHeaderCtrl*)con_valiable_list.GetDlgItem(0);
header->SetFont(&font); //Font Size 설정 list coulumn name (header) 높이 설정  (header만 설정)

 

8. CListCtrl item색상 변경

 

drawCustum 함수로 변경할 수 있다.
list에서 변경이 있으면 변경된 item 순서대로 drawCustum이 호출된다. (변경되지 않은 아이템은 호출은 하되 변경안해줌)

 

 

9. 특정 row 하이라이트 및 스크롤 위치 이동

//특정위치 하이라이트
m_list.SetSelectionMark(i);
m_list.EnsureVisible(i, TRUE); //스크롤
m_list.SetItemState(m_list.GetSelectionMark(), LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED);
m_list.SetFocus();

 

 

[참고] 모든 선택 해제: https://objectbuilder.tistory.com/168

 

10. 특정 컬럼을 삭제하고, 추가하기

아래 예제는 마지막 칼럼을 추가하고 삭제하는 예제입니다.

 


//마지막 컬럼 삭제
int count = mylist.GetHeaderCtrl()->GetItemCount(); //컬럼의 개수를 얻는다.
con_tri_list.DeleteColumn(count-1);   //마지막 컬럼삭제 0이 첫 칼럼이니까 1을 빼줘야한다.


//마지막에 컬럼 추가
int count = mylist.GetHeaderCtrl()->GetItemCount();
mylist.InsertColumn(count, "new Column", LVCFMT_LEFT, 100, -1);

'◼️MFC' 카테고리의 다른 글

[MFC] 리소스 뷰에서 컴포넌트 최상단에 위치시키기  (0) 2023.01.02
[MFC] 다이얼로그 모달 방식 malloc 불가?  (0) 2022.10.11
[MFC] 동적 메모리 할당한 구조체의 CString형 변수 에러  (0) 2022.10.08
[MFC] CListCtrl에 많은 항목을 추가해야할 때 속도를 향상시키는 방법 (LVS_OWNERDATA, SetItemCountEx)  (0) 2022.10.05
[MFC] CString 문자열 ( ) 속 문자열 추출  (0) 2022.09.12

    티스토리툴바