📄 treeoptionsctrl.cpp
字号:
ASSERT(m_pDateTime);
ASSERT(m_pDateTime->IsKindOf(RUNTIME_CLASS(CTreeOptionsDateCtrl))); //Your class must be derived from CTreeOptionsDateCtrl
m_pDateTime->SetTreeBuddy(this);
m_pDateTime->SetTreeItem(hItem);
}
else if (pItemData->m_pRuntimeClass1->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsIPAddressCtrl)))
{
//Get the current text in the edit box item
sEditText = GetEditText(hItem);
//Now that we have the current text remove it from the tree control text
RemoveChildControlText(hItem);
//Create the new edit box
m_pIPAddress = (CTreeOptionsIPAddressCtrl*) pItemData->m_pRuntimeClass1->CreateObject();
ASSERT(m_pIPAddress);
ASSERT(m_pIPAddress->IsKindOf(RUNTIME_CLASS(CTreeOptionsIPAddressCtrl))); //Your class must be derived from CTreeOptionsIPAddressCtrl
m_pIPAddress->SetTreeBuddy(this);
m_pIPAddress->SetTreeItem(hItem);
}
else if (pItemData->m_pRuntimeClass1->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsBrowseButton)))
{
//work out the rects for item
CRect rText;
GetItemRect(hItem, &rText, TRUE);
CRect rLine;
GetItemRect(hItem, &rLine, FALSE);
//Create the new static
m_pButton = (CTreeOptionsBrowseButton*) pItemData->m_pRuntimeClass1->CreateObject();
ASSERT(m_pButton);
ASSERT(m_pButton->IsKindOf(RUNTIME_CLASS(CTreeOptionsBrowseButton))); //Your class must be derived from CTreeOptionsStatic
m_pButton->SetTreeBuddy(this);
m_pButton->SetTreeItem(hItem);
if (pItemData->m_Type == CTreeOptionsItemData::ColorBrowser)
{
//Get the current color from the control and let the button know about it
COLORREF color = GetColor(hItem);
m_pButton->SetColor(color);
}
else if (pItemData->m_Type == CTreeOptionsItemData::FontBrowser)
{
LOGFONT lf;
GetFontItem(hItem, &lf);
m_pButton->SetFontItem(&lf);
}
else
{
ASSERT(pItemData->m_Type == CTreeOptionsItemData::OpaqueBrowser);
}
}
else
ASSERT(FALSE); //Your class must be derived from one of the classes in the previous statements
//allocate the secondary control
if (pItemData->m_pRuntimeClass2)
{
if (pItemData->m_pRuntimeClass2->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsSpinCtrl)))
{
m_pSpin = (CTreeOptionsSpinCtrl*) pItemData->m_pRuntimeClass2->CreateObject();
ASSERT(m_pSpin);
ASSERT(m_pSpin->IsKindOf(RUNTIME_CLASS(CTreeOptionsSpinCtrl))); //Your class must be derived from CTreeOptionsSpinCtrl
m_pSpin->SetTreeBuddy(this);
m_pSpin->SetTreeItem(hItem);
}
else
{
ASSERT(pItemData->m_pRuntimeClass2->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsBrowseButton)));
m_pButton = (CTreeOptionsBrowseButton*) pItemData->m_pRuntimeClass2->CreateObject();
ASSERT(m_pButton);
ASSERT(m_pButton->IsKindOf(RUNTIME_CLASS(CTreeOptionsBrowseButton))); //Your class must be derived from CTreeOptionsBrowseButton
m_pButton->SetTreeBuddy(this);
m_pButton->SetTreeItem(hItem);
}
}
//Update the rects for item
CRect rText;
GetItemRect(hItem, &rText, TRUE);
CRect rLine;
GetItemRect(hItem, &rLine, FALSE);
CRect r;
r.top = rText.top;
r.left = rText.right + 2;
//Now create the main control
ASSERT(pItemData->m_pRuntimeClass1);
if (pItemData->m_pRuntimeClass1->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsCombo)))
{
if (m_pButton)
r.right = rLine.right - m_pButton->GetWidth();
else
r.right = rLine.right;
r.bottom = r.top + m_pCombo->GetDropDownHeight(); //Ask the combo box for the height to use
m_pCombo->Create(m_pCombo->GetWindowStyle(), r, this, TREE_OPTIONS_COMBOBOX_ID);
ASSERT(m_pCombo->GetCount()); //You forget to add string items to the combo box in your OnCreate message handler!
//set the font the combo box should use based on the font in the tree control,
m_pCombo->SetFont(&m_Font);
//Also select the right text into the combo box
DWORD dwComboStyle = m_pCombo->GetStyle();
BOOL bComboHasEdit = (((dwComboStyle & CBS_DROPDOWN) | (dwComboStyle & CBS_SIMPLE)) != 0);
if ((dwComboStyle & CBS_DROPDOWNLIST) == CBS_DROPDOWNLIST)
bComboHasEdit = FALSE;
if (bComboHasEdit)
m_pCombo->SetWindowText(sComboText);
else
m_pCombo->SelectString(-1, sComboText);
//Auto select the control if configured to do so
if (m_bAutoSelect)
m_pCombo->SetFocus();
}
else if (pItemData->m_pRuntimeClass1->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsEdit)))
{
if (m_pButton)
r.right = rLine.right - m_pButton->GetWidth();
else
r.right = rLine.right;
r.bottom = r.top + m_pEdit->GetHeight(rText.Height());
VERIFY(m_pEdit->CreateEx(WS_EX_CLIENTEDGE, _T("Edit"), sEditText, m_pEdit->GetWindowStyle(), r, this, TREE_OPTIONS_EDITBOX_ID));
//set the font the edit box should use based on the font in the tree control
m_pEdit->SetFont(&m_Font);
//Auto select the control if configured to do so
if (m_bAutoSelect)
m_pEdit->SetFocus();
}
else if (pItemData->m_pRuntimeClass1->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsDateCtrl)))
{
r.right = rLine.right;
r.bottom = rLine.bottom;
VERIFY(m_pDateTime->Create(m_pDateTime->GetWindowStyle(), r, this, TREE_OPTIONS_DATETIMECTRL_ID));
//set the font the date time control should use based on the font in the list control
m_pDateTime->SetFont(&m_Font);
//set the value in the control
m_pDateTime->SetTime(pItemData->m_DateTime);
//Auto select the control if configured to do so
if (m_bAutoSelect)
m_pDateTime->SetFocus();
}
else if (pItemData->m_pRuntimeClass1->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsIPAddressCtrl)))
{
r.right = rLine.right;
r.bottom = rLine.bottom;
VERIFY(m_pIPAddress->Create(m_pIPAddress->GetWindowStyle(), r, this, TREE_OPTIONS_IPADDRESSCTRL_ID));
//set the font the IP Address control should use based on the font in the list control
m_pIPAddress->SetFont(&m_Font);
DWORD dwAddress = GetIPAddress(hItem);
m_pIPAddress->SetAddress(dwAddress);
//Auto select the control if configured to do so
if (m_bAutoSelect)
m_pIPAddress->SetFocus();
}
else if (pItemData->m_pRuntimeClass1->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsBrowseButton)))
{
CreateBrowseButton(pItemData->m_pRuntimeClass1, rLine, rText);
}
else
ASSERT(FALSE); //Your class must be derived from one of the classes in the statements above
//Actually create the secondary control
if (pItemData->m_pRuntimeClass2)
{
if (pItemData->m_pRuntimeClass2->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsSpinCtrl)))
{
CreateSpinCtrl(pItemData->m_pRuntimeClass2, rLine, rText, r);
}
else
{
ASSERT(pItemData->m_pRuntimeClass2->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsBrowseButton)));
CreateBrowseButton(pItemData->m_pRuntimeClass2, rLine, rText);
if (m_pEdit)
m_pEdit->SetButtonBuddy(m_pButton);
else
{
ASSERT(m_pCombo);
m_pCombo->SetButtonBuddy(m_pButton);
}
}
}
}
void CTreeOptionsCtrl::UpdateTreeControlValueFromChildControl(HTREEITEM hItem)
{
if (m_pCombo)
{
CString sText;
m_pCombo->GetWindowText(sText);
SetComboText(m_hControlItem, sText);
}
else if (m_pEdit)
{
CString sText;
m_pEdit->GetWindowText(sText);
SetEditText(m_hControlItem, sText);
}
else if (m_pDateTime)
{
SYSTEMTIME st1;
if (m_pDateTime->GetTime(&st1) == GDT_VALID)
m_pDateTime->SetDateTime(st1);
SYSTEMTIME st2;
m_pDateTime->GetDateTime(st2);
SetDateTime(m_hControlItem, st2);
SetEditText(m_hControlItem, m_pDateTime->GetDisplayText(st2));
}
else if (m_pIPAddress)
{
DWORD dwAddress;
if (m_pIPAddress->GetAddress(dwAddress) == 4)
{
SetIPAddress(m_hControlItem, dwAddress);
SetEditText(m_hControlItem, m_pIPAddress->GetDisplayText(dwAddress));
}
}
else if (m_pButton)
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
ASSERT(pItemData);
if (pItemData->m_Type == CTreeOptionsItemData::ColorBrowser)
{
COLORREF color = m_pButton->GetColor();
SetColor(m_hControlItem, color);
}
else if (pItemData->m_Type == CTreeOptionsItemData::FontBrowser)
{
LOGFONT lf;
GetFontItem(hItem, &lf);
m_pButton->SetFontItem(&lf);
}
}
}
BOOL CTreeOptionsCtrl::AddEditBox(HTREEITEM hItem, CRuntimeClass* pRuntimeClassEditCtrl, DWORD dwItemData)
{
//Just call the combo box version as currently there is no difference
BOOL bSuccess = AddComboBox(hItem, pRuntimeClassEditCtrl, dwItemData);
//Update the type in the item data
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
ASSERT(pItemData);
pItemData->m_Type = CTreeOptionsItemData::EditBox;
return bSuccess;
}
BOOL CTreeOptionsCtrl::AddEditBox(HTREEITEM hItem, CRuntimeClass* pRuntimeClassEditCtrl, CRuntimeClass* pRuntimeClassSpinCtrl, DWORD dwItemData)
{
//Add the edit box
BOOL bSuccess = AddEditBox(hItem, pRuntimeClassEditCtrl, dwItemData);
//Add the spin ctrl
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
ASSERT(pItemData);
ASSERT(pItemData->m_pRuntimeClass1);
ASSERT(pItemData->m_pRuntimeClass2 == NULL);
ASSERT(pRuntimeClassSpinCtrl);
pItemData->m_pRuntimeClass2 = pRuntimeClassSpinCtrl;
pItemData->m_Type = CTreeOptionsItemData::Spin;
pItemData->m_dwItemData = dwItemData;
return bSuccess;
}
BOOL CTreeOptionsCtrl::AddFileEditBox(HTREEITEM hItem, CRuntimeClass* pRuntimeClassEditCtrl, CRuntimeClass* pRuntimeClassButton, DWORD dwItemData)
{
//Add the edit box
BOOL bSuccess = AddEditBox(hItem, pRuntimeClassEditCtrl, dwItemData);
//Add the browse button
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
ASSERT(pItemData);
ASSERT(pItemData->m_pRuntimeClass1);
ASSERT(pItemData->m_pRuntimeClass2 == NULL);
ASSERT(pRuntimeClassButton);
pItemData->m_pRuntimeClass2 = pRuntimeClassButton;
pItemData->m_Type = CTreeOptionsItemData::FileBrowser;
return bSuccess;
}
BOOL CTreeOptionsCtrl::AddColorSelector(HTREEITEM hItem, CRuntimeClass* pRuntimeClassButton, DWORD dwItemData, BOOL bDrawColorForIcon)
{
//Add the browse button as the primary control
BOOL bSuccess = AddEditBox(hItem, pRuntimeClassButton, dwItemData);
//Setup the browser type
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
ASSERT(pItemData);
pItemData->m_Type = CTreeOptionsItemData::ColorBrowser;
pItemData->m_bDrawColorForIcon = bDrawColorForIcon;
return bSuccess;
}
COLORREF CTreeOptionsCtrl::GetColor(HTREEITEM hItem) const
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
ASSERT(pItemData);
return pItemData->m_Color;
}
void CTreeOptionsCtrl::SetColor(HTREEITEM hItem, COLORREF color)
{
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
ASSERT(pItemData);
pItemData->m_Color = color;
//Also update the text while we are at it
CString sColor;
sColor.Format(_T("&%02x%02x%02x"), GetRValue(color), GetGValue(color), GetBValue(color));
sColor.MakeUpper();
SetEditText(hItem, sColor);
}
BOOL CTreeOptionsCtrl::AddFontSelector(HTREEITEM hItem, CRuntimeClass* pRuntimeClassButton, DWORD dwItemData)
{
//Add the browse button as the primary control
BOOL bSuccess = AddEditBox(hItem, pRuntimeClassButton, dwItemData);
//Setup the browser type
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
ASSERT(pItemData);
pItemData->m_Type = CTreeOptionsItemData::FontBrowser;
return bSuccess;
}
void CTreeOptionsCtrl::GetFontItem(HTREEITEM hItem, LOGFONT* pLogFont) const
{
ASSERT(pLogFont);
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
ASSERT(pItemData);
CopyMemory(pLogFont, &pItemData->m_Font, sizeof(LOGFONT));
}
void CTreeOptionsCtrl::SetFontItem(HTREEITEM hItem, const LOGFONT* pLogFont)
{
ASSERT(pLogFont);
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
ASSERT(pItemData);
CopyMemory(&pItemData->m_Font, pLogFont, sizeof(LOGFONT));
//Also update the text while we are at it
SetEditText(hItem, pLogFont->lfFaceName);
}
CString CTreeOptionsCtrl::GetFileEditText(HTREEITEM hItem) const
{
//Just call the edit box version as currently there is no difference
return GetEditText(hItem);
}
void CTreeOptionsCtrl::SetFileEditText(HTREEITEM hItem, const CString& sEditText)
{
//Just call the edit box version as currently there is no difference
SetEditText(hItem, sEditText);
}
BOOL CTreeOptionsCtrl::AddFolderEditBox(HTREEITEM hItem, CRuntimeClass* pRuntimeClassEditCtrl, CRuntimeClass* pRuntimeClassButton, DWORD dwItemData)
{
//Let the File edit box code do all the work
BOOL bSuccess = AddFileEditBox(hItem, pRuntimeClassEditCtrl, pRuntimeClassButton, dwItemData);
//Setup the correct edit type in the item data
CTreeOptionsItemData* pItemData = (CTreeOptionsItemData*) GetItemData(hItem);
pItemData->m_Type = CTreeOptionsItemData::FolderBrowser;
return bSuccess;
}
CString CTreeOptionsCtrl::GetFolderEditText(HTREEITEM hItem) const
{
//Just call the edit box version as currently there is no difference
return GetEditText(hItem);
}
void CTreeOptionsCtrl::SetFolderEditText(HTREEITEM hItem, const CString& sEditText)
{
//Just call the edit box version as currently there is no difference
SetEditText(hItem, sEditText);
}
void CTreeOptionsCtrl::CreateSpinCtrl(CRuntimeClass* pRuntimeClassSpinCtrl, CRect rItem, CRect /*rText*/, CRect rPrimaryControl)
{
ASSERT(pRuntimeClassSpinCtrl);
if (pRuntimeClassSpinCtrl->IsDerivedFrom(RUNTIME_CLASS(CTreeOptionsSpinCtrl)))
{
//work out the rect this secondary control
CRect r;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -