📄 treeoptionsctrl.cpp
字号:
else
{
BOOL bEnable;
VERIFY(GetCheckBoxEnable(hParent, bEnable));
SetEnabledSemiCheckBox(hParent, bEnable);
}
}
//Reset the redraw flag
SetRedraw(TRUE);
}
void CTreeOptionsCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
UINT uFlags=0;
HTREEITEM hItem = HitTest(point, &uFlags);
//If the mouse was over the label, icon or to the left or right of the item ?
BOOL bHit = FALSE;
if (m_bToggleOverIconOnly)
bHit = uFlags == TVHT_ONITEMICON;
else
bHit = (uFlags & TVHT_ONITEM) || (uFlags & TVHT_ONITEMINDENT) || (uFlags & TVHT_ONITEMRIGHT);
if (bHit)
{
if (IsCheckBox(hItem))
{
BOOL bEnable;
VERIFY(GetCheckBoxEnable(hItem, bEnable));
if (bEnable)
{
//Turn of redraw to Q all the changes we're going to make here
SetRedraw(FALSE);
//Toggle the state of check items
BOOL bCheck;
VERIFY(GetCheckBox(hItem, bCheck));
HandleCheckBox(hItem, bCheck);
}
}
else if (IsRadioButton(hItem))
{
BOOL bEnable;
VERIFY(GetRadioButtonEnable(hItem, bEnable));
if (bEnable)
{
//Check the radio button if not already checked
BOOL bCheck;
VERIFY(GetRadioButton(hItem, bCheck));
if (!bCheck)
VERIFY(SetRadioButton(hItem));
}
}
//Pass on to the parent now that we that we have done our stuff
CTreeCtrl::OnLButtonDown(nFlags, point);
}
else
{
//Pass on to the parent since we didn't handle it
CTreeCtrl::OnLButtonDown(nFlags, point);
}
}
void CTreeOptionsCtrl::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_SPACE)
{
HTREEITEM hItem = GetSelectedItem();
//If the space key is hit, and the item is a combo item, then toggle the check value
if (IsCheckBox(hItem))
{
BOOL bEnable;
VERIFY(GetCheckBoxEnable(hItem, bEnable));
if (bEnable)
{
//Turn of redraw to Q all the changes we're going to make here
SetRedraw(FALSE);
BOOL bCheck;
VERIFY(GetCheckBox(hItem, bCheck));
HandleCheckBox(hItem, bCheck);
}
else
{
//Pass on to the parent since we didn't handle it
CTreeCtrl::OnChar(nChar, nRepCnt, nFlags);
}
}
else if (IsRadioButton(hItem)) //If the item is a radio item, then check it and uncheck all other items
{
BOOL bEnable;
VERIFY(GetRadioButtonEnable(hItem, bEnable));
if (bEnable)
{
//Check the radio button if not already checked
BOOL bCheck;
VERIFY(GetRadioButton(hItem, bCheck));
if (!bCheck)
VERIFY(SetRadioButton(hItem));
}
else
{
//Pass on to the parent since we didn't handle it
CTreeCtrl::OnChar(nChar, nRepCnt, nFlags);
}
}
else
{
//Pass on to the parent since we didn't handle it
CTreeCtrl::OnChar(nChar, nRepCnt, nFlags);
}
}
else
{
//Pass on to the parent since we didn't handle it
CTreeCtrl::OnChar(nChar, nRepCnt, nFlags);
}
}
HTREEITEM CTreeOptionsCtrl::InsertGroup(LPCTSTR lpszItem, int nImage, HTREEITEM hParent, HTREEITEM hAfter, DWORD dwItemData)
{
ASSERT(nImage > 9); //You must specify an image index greater than 9 as the
//first 10 images in the image list are reserved for the
//checked and unchecked check box and radio buttons images
HTREEITEM hItem = InsertItem(lpszItem, nImage, nImage, hParent, hAfter);
CTreeOptionsItemData* pItemData = new CTreeOptionsItemData;
pItemData->m_pRuntimeClass1 = NULL;
pItemData->m_Type = CTreeOptionsItemData::Normal;
pItemData->m_dwItemData = dwItemData;
SetItemData(hItem, (DWORD) pItemData);
return hItem;
}
HTREEITEM CTreeOptionsCtrl::InsertCheckBox(LPCTSTR lpszItem, HTREEITEM hParent, BOOL bCheck, HTREEITEM hAfter, DWORD dwItemData)
{
ASSERT((hParent == TVI_ROOT) || IsGroup(hParent) || IsCheckBox(hParent)); //The parent of a check box must be a group item or another check box
HTREEITEM hItem = InsertItem(lpszItem, 0, 0, hParent, hAfter);
CTreeOptionsItemData* pItemData = new CTreeOptionsItemData;
pItemData->m_pRuntimeClass1 = NULL;
pItemData->m_Type = CTreeOptionsItemData::CheckBox;
pItemData->m_dwItemData = dwItemData;
SetItemData(hItem, (DWORD) pItemData);
BOOL bSuccess = SetCheckBox(hItem, bCheck);
ASSERT(bSuccess);
return hItem;
}
HTREEITEM CTreeOptionsCtrl::InsertRadioButton(LPCTSTR lpszItem, HTREEITEM hParent, BOOL bCheck, HTREEITEM hAfter, DWORD dwItemData)
{
ASSERT(IsGroup(hParent)); //The parent of a radio item must be a group item
HTREEITEM hItem = InsertItem(lpszItem, 2, 2, hParent, hAfter);
CTreeOptionsItemData* pItemData = new CTreeOptionsItemData;
pItemData->m_pRuntimeClass1 = NULL;
pItemData->m_Type = CTreeOptionsItemData::RadioButton;
pItemData->m_dwItemData = dwItemData;
SetItemData(hItem, (DWORD) pItemData);
if (bCheck)
{
//if requested to, check the newly added radio button
BOOL bSuccess = SetRadioButton(hItem);
ASSERT(bSuccess);
}
return hItem;
}
BOOL CTreeOptionsCtrl::IsGroup(HTREEITEM hItem) const
{
int nImage = -1;
int nSelectedImage = -1 ;
BOOL bSuccess = GetItemImage(hItem, nImage, nSelectedImage);
ASSERT(bSuccess);
return (nImage > 7);
}
BOOL CTreeOptionsCtrl::IsCheckBox(HTREEITEM hItem) const
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
if (pItemData)
return pItemData->m_Type == CTreeOptionsItemData::CheckBox;
else
return FALSE;
}
BOOL CTreeOptionsCtrl::IsRadioButton(HTREEITEM hItem) const
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
if (pItemData)
return pItemData->m_Type == CTreeOptionsItemData::RadioButton;
else
return FALSE;
}
BOOL CTreeOptionsCtrl::IsEditBox(HTREEITEM hItem) const
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
if (pItemData)
return pItemData->m_Type == CTreeOptionsItemData::EditBox;
else
return FALSE;
}
BOOL CTreeOptionsCtrl::IsColorItem(HTREEITEM hItem) const
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
if (pItemData)
return pItemData->m_Type == CTreeOptionsItemData::ColorBrowser;
else
return FALSE;
}
BOOL CTreeOptionsCtrl::IsFontItem(HTREEITEM hItem) const
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
if (pItemData)
return pItemData->m_Type == CTreeOptionsItemData::FontBrowser;
else
return FALSE;
}
BOOL CTreeOptionsCtrl::IsFileItem(HTREEITEM hItem) const
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
if (pItemData)
return pItemData->m_Type == CTreeOptionsItemData::FileBrowser;
else
return FALSE;
}
BOOL CTreeOptionsCtrl::IsFolderItem(HTREEITEM hItem) const
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
if (pItemData)
return pItemData->m_Type == CTreeOptionsItemData::FolderBrowser;
else
return FALSE;
}
BOOL CTreeOptionsCtrl::IsDateTimeItem(HTREEITEM hItem) const
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
if (pItemData)
return pItemData->m_Type == CTreeOptionsItemData::DateTimeCtrl;
else
return FALSE;
}
BOOL CTreeOptionsCtrl::IsIPAddressItem(HTREEITEM hItem) const
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
if (pItemData)
return pItemData->m_Type == CTreeOptionsItemData::IPAddressCtrl;
else
return FALSE;
}
BOOL CTreeOptionsCtrl::IsOpaqueItem(HTREEITEM hItem) const
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
if (pItemData)
return pItemData->m_Type == CTreeOptionsItemData::OpaqueBrowser;
else
return FALSE;
}
BOOL CTreeOptionsCtrl::SetCheckBox(HTREEITEM hItem, BOOL bCheck)
{
//Validate our parameters
ASSERT(IsCheckBox(hItem)); //Must be a check box to check it
BOOL bSemi;
VERIFY(GetSemiCheckBox(hItem, bSemi));
BOOL bSuccess;
if (bCheck)
{
if (bSemi)
bSuccess = SetItemImage(hItem, 8, 8);
else
bSuccess = SetItemImage(hItem, 1, 1);
}
else
bSuccess = SetItemImage(hItem, 0, 0);
return bSuccess;
}
BOOL CTreeOptionsCtrl::SetEnabledSemiCheckBox(HTREEITEM hItem, BOOL bSemi)
{
//Validate our parameters
ASSERT(IsCheckBox(hItem)); //Must be a check box to check it
if (bSemi)
return SetItemImage(hItem, 8, 8);
else
return SetItemImage(hItem, 9, 9);
}
BOOL CTreeOptionsCtrl::GetCheckBox(HTREEITEM hItem, BOOL& bCheck) const
{
//Validate our parameters
ASSERT(IsCheckBox(hItem)); //Must be a combo item to check it
int nImage;
int nSelectedImage;
BOOL bSuccess = GetItemImage(hItem, nImage, nSelectedImage);
ASSERT(bSuccess);
bCheck = (nImage == 1 || nImage == 5 || nImage == 8 || nImage == 9);
return bSuccess;
}
BOOL CTreeOptionsCtrl::SetRadioButton(HTREEITEM hParent, int nIndex)
{
//Validate our parameters
ASSERT(IsGroup(hParent)); //Parent item must be a group item
//Iterate through the child items and turn on the specified one and turn off all the other ones
HTREEITEM hChild = GetNextItem(hParent, TVGN_CHILD);
//Turn of redraw to Q all the changes we're going to make here
SetRedraw(FALSE);
int i=0;
BOOL bCheckedSomeItem = FALSE;
while (hChild)
{
//if we reach a non radio button then break out of the loop
if (!IsRadioButton(hChild))
break;
if (i == nIndex)
{
//Turn this item on
VERIFY(SetItemImage(hChild, 3, 3));
bCheckedSomeItem = TRUE;
}
else
{
BOOL bEnable;
VERIFY(GetRadioButtonEnable(hChild, bEnable));
//Turn this item off
if (bEnable)
VERIFY(SetItemImage(hChild, 2, 2));
else
VERIFY(SetItemImage(hChild, 4, 4));
}
//Move on to the next item
hChild = GetNextItem(hChild, TVGN_NEXT);
++i;
}
ASSERT(bCheckedSomeItem); //You specified an index which does not exist
//Reset the redraw flag
SetRedraw(TRUE);
return TRUE;
}
BOOL CTreeOptionsCtrl::SetRadioButton(HTREEITEM hItem)
{
//Validate our parameters
ASSERT(IsRadioButton(hItem)); //Must be a radio item to check it
//Iterate through the sibling items and turn them all off except this one
HTREEITEM hParent = GetNextItem(hItem, TVGN_PARENT);
ASSERT(IsGroup(hParent)); //Parent item must be a group item
//Iterate through the child items and turn on the specified one and turn off all the other ones
HTREEITEM hChild = GetNextItem(hParent, TVGN_CHILD);
//Turn of redraw to Q all the changes we're going to make here
SetRedraw(FALSE);
while (hChild)
{
//if we reach a non radio button then break out of the loop
if (!IsRadioButton(hChild))
break;
if (hChild == hItem)
{
//Turn this item on
BOOL bSuccess = SetItemImage(hChild, 3, 3);
ASSERT(bSuccess);
}
else
{
BOOL bEnable;
VERIFY(GetRadioButtonEnable(hChild, bEnable));
//Turn this item off
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -