當前位置

首頁 > 商務英語 > 計算機英語 > c中checkbox的用法

c中checkbox的用法

推薦人: 來源: 閱讀: 1.45W 次

c中Checkbox的用法的用法你知道嗎?下面小編就跟你們詳細介紹下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_enToClient(&point); //轉化成客戶座標

hTree = m_est(point,&uFlag); //返回與CtreeTtrl關聯的光標的當前位置和句柄

if((TVHT_NOWHERE & uFlag))

{

return;

}

if (hTree && (TVHT_ONITEMSTATEICON & uFlag)) //點中複選框

{

m_ctItem(hTree);

CString temp = m_temText(hTree) + "rn";

TRACE(temp);

bCheck = m_heck(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_nd(hTree,TVE_EXPAND);

hTree = m_hildItem(hTree); //獲取子項句柄

while (hTree)

{

m_heck(hTree, bCheck);

SetChildCheck(hTree,bCheck); //遞歸調用

hTree = m_extSiblingItem(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_arentItem(hTree);

if (hParent)

{

HTREEITEM hChild = m_hildItem(hParent);

while (hChild)

{

if (hChild == hTree)

{

hChild = m_extSiblingItem(hChild);

continue;

}

BOOL bflag = m_heck(hChild);

if (bCheck == bflag) //判斷是否還有兄弟項被選擇

{

return;

}

hChild = m_extSiblingItem(hChild);

}

m_heck(hParent,!bCheck);

SetParentCheck(hParent,bCheck); //設置父項的狀態

}