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); //設置父項的狀態
}