c中checkbox的使用方法

时间:2022-1-13 作者:淘学网

c中checkbox的用法的用法你知道吗?下面小编就跟你们详细介绍下c中checkbox的用法的用法,希望对你们有用。

c中checkbox的用法的用法如下:

1. 消息事件

(1)鼠标点击当前ITEM的CHECKBOX:引发NM_CLICK事件并传递TVHT_ONITEMSTATEICON。

(2)鼠标点击当前ITEM的TEXT:引发NM_CLICK事件。

(3)鼠标点击新ITEM的CHECKBOX:引发TVN_SELCHANGED事件、NM_CLICK事件并传递TVHT_ONITEMSTATEICON。

(4)鼠标点击新ITEM的TEXT:引发NM_CLICK事件、TVN_SELCHANGED事件。

2. 消息事件总结

点击ITEM会引发NM_CLICK事件。若点击CHECKBOX则传递TVHT_ONITEMSTATEICON。

因此可不处理TVN_SELCHANGED事件而只处理NM_CLICK事件。

3. 消息处理注意事项

(1)点击CHECKBOX后会自动更新CheckBox的状态,因此在处理代码中不需要使用SetCheck函数设置状态,而GetCheck函数返回也是其原始状态。

(2)点击新CHECKBOX后不会自动将对应的ITEM设置为选择状态,需要使用SelectItem函数进行设置。

4. 使用方法

(1)若传递TVHT_ONITEMSTATEICON

获取选择ITEM的状态并取反

若有子项则所有子项设置为一致

若没有子项则

若当前状态为TRUE则设置父项为TRUE;否则遍历所有兄弟项,若全为FALSE则设置父项为FALSE。

若选择了新ITEM则设置新ITEM为选择项

(2)若未传递TVHT_ONITEMSTATEICON

设置更新ITEM状态,获取选择ITEM的状态

若有子项则所有子项设置为一致

若没有子项则

若当前状态为TRUE则设置父项为TRUE;否则遍历所有兄弟项,若全为FALSE则设置父项为FALSE。

5. 响应NM_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

void CTestTimerDlg::OnClickTree(NMHDR* pNMHDR, LRESULT* pResult)

{

// TODO: Add your control notification handler code here

CPoint point;

UINT uFlag; //接收有关点击测试的信息的整数

HTREEITEM hTree;

BOOL bCheck;

GetCursorPos(&point);//获取屏幕鼠标坐标

m_TreeCtrl.ScreenToClient(&point); //转化成客户坐标

hTree = m_TreeCtrl.HitTest(point,&uFlag); //返回与CtreeTtrl关联的光标的当前位置和句柄

if((TVHT_NOWHERE & uFlag))

{

return;

}

if (hTree && (TVHT_ONITEMSTATEICON & uFlag)) //点中复选框

{

m_TreeCtrl.SelectItem(hTree);

CString temp = m_TreeCtrl.GetItemText(hTree) + "\r\n";

TRACE(temp);

bCheck = m_TreeCtrl.GetCheck(hTree);//获取当前复选状态

SetChildCheck(hTree,!bCheck);//设置子项复选状态

SetParentCheck(hTree, bCheck);//设置父项复选状态

}

*pResult = 0;

}

?

1

2

3

4

5

6

7

8

9

10

11

void CTestTimerDlg::SetChildCheck(HTREEITEM hTree,BOOL bCheck)

{

m_TreeCtrl.Expand(hTree,TVE_EXPAND);

hTree = m_TreeCtrl.GetChildItem(hTree); //获取子项句柄

while (hTree)

{

m_TreeCtrl.SetCheck(hTree, bCheck);

SetChildCheck(hTree,bCheck); //递归调用

hTree = m_TreeCtrl.GetNextSiblingItem(hTree); //获取兄弟的句柄

}

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

void CTestTimerDlg::SetParentCheck(HTREEITEM hTree,BOOL bCheck)

{

HTREEITEM hParent = m_TreeCtrl.GetParentItem(hTree);

if (hParent)

{

HTREEITEM hChild = m_TreeCtrl.GetChildItem(hParent);

while (hChild)

{

if (hChild == hTree)

{

hChild = m_TreeCtrl.GetNextSiblingItem(hChild);

continue;

}

BOOL bflag = m_TreeCtrl.GetCheck(hChild);

if (bCheck == bflag) //判断是否还有兄弟项被选择

{

return;

}

hChild = m_TreeCtrl.GetNextSiblingItem(hChild);

}

m_TreeCtrl.SetCheck(hParent,!bCheck);

SetParentCheck(hParent,bCheck);//设置父项的状态

}

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:375750496@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

今日推荐

少年儿童的英语小笑话阅读

笑话是一种用来逗笑取乐的文体。笑话,不仅能让同学们在日常生活和学习中不时地会心一笑,还能从中学习到不少的英语知识,小编今天就给大家带来了英语的笑话,供您查阅英语笑话一It happened that a Dog had got a piec