티스토리 뷰
CListCtrl 에서 체크박스가 체크표시되어 있는지 이벤트를 받기 위해 LVN_ITEMCHANGED 이벤트를 받으면 리스트컨트롤이 변경될때마다 호출되므로, 체크표시가 변경되어 호출된건지 검사해서 처리한다.
LM_CLICK 이벤트에서 처리해도 되겠지만, 체크박스 위에서 클릭하면 LM_CLICK 이벤트가 발생하지 않는 문제가 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 |
CListCtrl m_listBooking; // 멤버변수
BEGIN_MESSAGE_MAP(CBookingDlg, CDialogEx)
...
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_BOOKINGSTOCK, &CBookingStockDlg::OnItemchangedListBookingstock)
END_MESSAGE_MAP()
void CBookingkDlg::OnItemchangedListBooking(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
// 프로그램내부에서 체크박스의 값을 수정할때는 m_bListCtrlUpdate를 TRUE로 설정한다.
// 사용자가 마우스 클릭이나 스페이스바로 값을 변경할때만 수행하기위해 m_bListCtrlUpdate 값을 검사한다.
if (pNMLV->uChanged == LVIF_STATE)// && !m_bListCtrlUpdate)
{
// 도움말의 LVS_EX_CHECKBOXES 속성을 보면 아래와 같은 내용이 있다.
// State image 1 is the unchecked box, and state image 2 is the checked box.
// Setting the state image to zero removes the check box.
// 체크박스의 값을 변경할때만 이벤트가 발생하는 것이 아니고 항목을 생성할에도 이벤트가 발생한다.
// 그래서 State 값이 0인지도 검사한다.
UINT nOldCheck = pNMLV->uOldState & LVIS_STATEIMAGEMASK;
UINT nNewCheck = pNMLV->uNewState & LVIS_STATEIMAGEMASK;
if (nOldCheck && nNewCheck && nOldCheck != nNewCheck)
{
// 체크의 상태를 알아낼때 GetCheck() 함수를 사용하거나 pNMLV->uNewState 값으로 알수있다.
// CommCtrl.h 에 LVIS_STATEIMAGEMASK 값이 0xF000으로 정의 되어있으므로
// ((pNMLV->uNewState & LVIS_STATEIMAGEMASK) >> 12) 가 1이면 체크가 안된상태이고 2이면 체크인 상태이다.
BOOL bCheck = m_listBooking.GetCheck(pNMLV->iItem);
}
}
*pResult = 0;
} |
cs |