📄 treeoptionsctrlex.cpp
字号:
// checkbox checked
rcCtrl.MoveToX(iCtrlLeft+iBmpWidth*1);
if (hTheme){
g_xpStyle.DrawThemeBackground(hTheme, dcMem, BP_CHECKBOX, CBS_CHECKEDNORMAL, &rcCtrl, NULL);
g_xpStyle.DrawThemeEdge(hTheme, dcMem, BP_CHECKBOX, CBS_CHECKEDNORMAL, &rcCtrl, 0, 0, NULL);
}
else
dcMem.DrawFrameControl(&rcCtrl, DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_FLAT);
// radio
rcCtrl.MoveToX(iCtrlLeft+iBmpWidth*2);
if (hTheme){
g_xpStyle.DrawThemeBackground(hTheme, dcMem, BP_RADIOBUTTON, RBS_UNCHECKEDNORMAL, &rcCtrl, NULL);
g_xpStyle.DrawThemeEdge(hTheme, dcMem, BP_CHECKBOX, RBS_UNCHECKEDNORMAL, &rcCtrl, 0, 0, NULL);
} else
dcMem.DrawFrameControl(&rcCtrl, DFC_BUTTON, DFCS_BUTTONRADIO | DFCS_FLAT);
// radio checked
rcCtrl.MoveToX(iCtrlLeft+iBmpWidth*3);
if (hTheme){
g_xpStyle.DrawThemeBackground(hTheme, dcMem, BP_RADIOBUTTON, RBS_CHECKEDNORMAL, &rcCtrl, NULL);
g_xpStyle.DrawThemeEdge(hTheme, dcMem, BP_CHECKBOX, RBS_CHECKEDNORMAL, &rcCtrl, 0, 0, NULL);
} else
dcMem.DrawFrameControl(&rcCtrl, DFC_BUTTON, DFCS_BUTTONRADIO | DFCS_CHECKED | DFCS_FLAT);
// checkbox disabled
rcCtrl.MoveToX(iCtrlLeft+iBmpWidth*4);
if (hTheme){
g_xpStyle.DrawThemeBackground(hTheme, dcMem, BP_CHECKBOX, CBS_UNCHECKEDDISABLED, &rcCtrl, NULL);
g_xpStyle.DrawThemeEdge(hTheme, dcMem, BP_CHECKBOX, CBS_UNCHECKEDDISABLED, &rcCtrl, 0, 0, NULL);
} else
dcMem.DrawFrameControl(&rcCtrl, DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_INACTIVE | DFCS_FLAT);
// checkbox checked disabled
rcCtrl.MoveToX(iCtrlLeft+iBmpWidth*5);
if (hTheme){
g_xpStyle.DrawThemeBackground(hTheme, dcMem, BP_CHECKBOX, CBS_CHECKEDDISABLED, &rcCtrl, NULL);
g_xpStyle.DrawThemeEdge(hTheme, dcMem, BP_CHECKBOX, CBS_CHECKEDDISABLED, &rcCtrl, 0, 0, NULL);
} else
dcMem.DrawFrameControl(&rcCtrl, DFC_BUTTON, DFCS_BUTTONCHECK | DFCS_CHECKED | DFCS_INACTIVE | DFCS_FLAT);
// radio disabled
rcCtrl.MoveToX(iCtrlLeft+iBmpWidth*6);
if (hTheme){
g_xpStyle.DrawThemeBackground(hTheme, dcMem, BP_RADIOBUTTON, RBS_UNCHECKEDDISABLED, &rcCtrl, NULL);
g_xpStyle.DrawThemeEdge(hTheme, dcMem, BP_CHECKBOX, RBS_UNCHECKEDDISABLED, &rcCtrl, 0, 0, NULL);
} else
dcMem.DrawFrameControl(&rcCtrl, DFC_BUTTON, DFCS_BUTTONRADIO | DFCS_INACTIVE | DFCS_FLAT);
// radio checked disabled
rcCtrl.MoveToX(iCtrlLeft+iBmpWidth*7);
if (hTheme){
g_xpStyle.DrawThemeBackground(hTheme, dcMem, BP_RADIOBUTTON, RBS_CHECKEDDISABLED, &rcCtrl, NULL);
g_xpStyle.DrawThemeEdge(hTheme, dcMem, BP_CHECKBOX, RBS_CHECKEDDISABLED, &rcCtrl, 0, 0, NULL);
} else
dcMem.DrawFrameControl(&rcCtrl, DFC_BUTTON, DFCS_BUTTONRADIO | DFCS_CHECKED | DFCS_INACTIVE | DFCS_FLAT);
// checkbox checked tri-state
rcCtrl.MoveToX(iCtrlLeft+iBmpWidth*8);
if (hTheme){
g_xpStyle.DrawThemeBackground(hTheme, dcMem, BP_CHECKBOX, CBS_MIXEDNORMAL, &rcCtrl, NULL);
g_xpStyle.DrawThemeEdge(hTheme, dcMem, BP_CHECKBOX, CBS_MIXEDNORMAL, &rcCtrl, 0, 0, NULL);
} else
dcMem.DrawFrameControl(&rcCtrl, DFC_BUTTON, DFCS_BUTTON3STATE | DFCS_CHECKED | DFCS_FLAT);
// checkbox checked tri-state disabled
rcCtrl.MoveToX(iCtrlLeft+iBmpWidth*9);
if (hTheme){
g_xpStyle.DrawThemeBackground(hTheme, dcMem, BP_CHECKBOX, CBS_MIXEDDISABLED, &rcCtrl, NULL);
g_xpStyle.DrawThemeEdge(hTheme, dcMem, BP_CHECKBOX, CBS_MIXEDDISABLED, &rcCtrl, 0, 0, NULL);
} else
dcMem.DrawFrameControl(&rcCtrl, DFC_BUTTON, DFCS_BUTTON3STATE | DFCS_CHECKED | DFCS_INACTIVE | DFCS_FLAT);
ASSERT( TREEOPTSCTRLIMG_EDIT == 11 );
rcBmp.MoveToX(iBmpWidth*11);
rcCtrl.MoveToX(iCtrlLeft+iBmpWidth*11);
CFont font;
font.CreatePointFont(10, _T("Courier"));
CFont* pOldFont = dcMem.SelectObject(&font);
dcMem.TextOut(rcCtrl.left+2, rcCtrl.top, _T("I"));
dcMem.SelectObject(pOldFont);
CRect rcEdge(rcBmp);
rcEdge.top += 1;
rcEdge.bottom -= 1;
dcMem.DrawEdge(&rcEdge, EDGE_ETCHED, BF_RECT);
if (hTheme){
g_xpStyle.CloseThemeData(hTheme);
hTheme = NULL;
}
hTheme = (g_xpStyle.IsThemeActive() && g_xpStyle.IsAppThemed()) ? g_xpStyle.OpenThemeData(NULL, L"COMBOBOX") : NULL;
rcCtrl.MoveToX(iCtrlLeft+iBmpWidth*12);
if (hTheme){
g_xpStyle.DrawThemeBackground(hTheme, dcMem, CP_DROPDOWNBUTTON, CBXS_NORMAL, &rcCtrl, NULL);
g_xpStyle.DrawThemeEdge(hTheme, dcMem, CP_DROPDOWNBUTTON, CBXS_NORMAL, &rcCtrl, 0, 0, NULL);
} else
dcMem.DrawFrameControl(&rcCtrl, DFC_SCROLL, DFCS_SCROLLCOMBOBOX | DFCS_FLAT);
dcMem.SelectObject(pOldBmp);
m_ilTree.Add(&bmpControls, RGB(255,0,255));
if (hTheme)
g_xpStyle.CloseThemeData(hTheme);
}
}
}
ReleaseDC(pDCScreen);
}
}
void CTreeOptionsCtrlEx::HandleChildControlLosingFocus()
{
CTreeOptionsCtrl::HandleChildControlLosingFocus();
}
void CTreeOptionsCtrlEx::SetEditLabel(HTREEITEM hItem, const CString& rstrLabel)
{
const CString& rstrSep = GetTextSeparator();
CString strItemText = GetItemText(hItem);
int nSeparator = strItemText.Find(rstrSep);
CString strData;
if (nSeparator != -1)
strData = strItemText.Mid(nSeparator + rstrSep.GetLength());
SetItemText(hItem, rstrLabel + rstrSep + strData);
}
void CTreeOptionsCtrlEx::OnDestroy()
{
CTreeOptionsCtrl::OnDestroy();
m_ilTree.DeleteImageList();
}
//////////////////////////////////////////////////////////////////////////////
// DDX_...
void EditTextFloatFormat(CDataExchange* pDX, int nIDC, HTREEITEM hItem, void* pData, double value, int nSizeGcvt)
{
ASSERT(pData != NULL);
pDX->PrepareEditCtrl(nIDC);
HWND hWndCtrl;
pDX->m_pDlgWnd->GetDlgItem(nIDC, &hWndCtrl);
CTreeOptionsCtrl* pCtrlTreeOptions = (CTreeOptionsCtrl*) CWnd::FromHandlePermanent(hWndCtrl);
ASSERT(pCtrlTreeOptions);
ASSERT(pCtrlTreeOptions->IsKindOf(RUNTIME_CLASS(CTreeOptionsCtrl)));
if (pDX->m_bSaveAndValidate)
{
//::GetWindowText(hWndCtrl, szBuffer, _countof(szBuffer));
CString sText(pCtrlTreeOptions->GetEditText(hItem));
double d;
if (_stscanf(sText, _T("%lf"), &d) != 1)
{
AfxMessageBox(AFX_IDP_PARSE_REAL);
pDX->Fail(); // throws exception
}
if (nSizeGcvt == FLT_DIG)
*((float*)pData) = (float)d;
else
*((double*)pData) = d;
}
else
{
TCHAR szBuffer[400];
_stprintf(szBuffer, _T("%.*g"), nSizeGcvt, value);
//AfxSetWindowText(hWndCtrl, szBuffer);
pCtrlTreeOptions->SetEditText(hItem, szBuffer);
}
}
void EditTextWithFormat(CDataExchange* pDX, int nIDC, HTREEITEM hItem, LPCTSTR lpszFormat, UINT nIDPrompt, ...)
// only supports windows output formats - no floating point
{
va_list pData;
va_start(pData, nIDPrompt);
HWND hWndCtrl = pDX->PrepareEditCtrl(nIDC);
ASSERT( hWndCtrl != NULL );
CTreeOptionsCtrl* pCtrlTreeOptions = (CTreeOptionsCtrl*) CWnd::FromHandlePermanent(hWndCtrl);
ASSERT(pCtrlTreeOptions);
ASSERT(pCtrlTreeOptions->IsKindOf(RUNTIME_CLASS(CTreeOptionsCtrl)));
if (pDX->m_bSaveAndValidate)
{
void* pResult;
pResult = va_arg( pData, void* );
// the following works for %d, %u, %ld, %lu
//::GetWindowText(hWndCtrl, szT, _countof(szT));
CString sText(pCtrlTreeOptions->GetEditText(hItem));
if (_stscanf(sText, lpszFormat, pResult) != 1)
{
AfxMessageBox(nIDPrompt);
pDX->Fail(); // throws exception
}
}
else
{
TCHAR szT[64];
_vstprintf(szT, lpszFormat, pData);
// does not support floating point numbers - see dlgfloat.cpp
//AfxSetWindowText(hWndCtrl, szT);
pCtrlTreeOptions->SetEditText(hItem, szT);
}
va_end(pData);
}
void DDX_Text(CDataExchange* pDX, int nIDC, HTREEITEM hItem, int& value)
{
if (pDX->m_bSaveAndValidate)
EditTextWithFormat(pDX, nIDC, hItem, _T("%d"), AFX_IDP_PARSE_INT, &value);
else
EditTextWithFormat(pDX, nIDC, hItem, _T("%d"), AFX_IDP_PARSE_INT, value);
}
void DDX_Text(CDataExchange* pDX, int nIDC, HTREEITEM hItem, UINT& value)
{
if (pDX->m_bSaveAndValidate)
EditTextWithFormat(pDX, nIDC, hItem, _T("%u"), AFX_IDP_PARSE_UINT, &value);
else
EditTextWithFormat(pDX, nIDC, hItem, _T("%u"), AFX_IDP_PARSE_UINT, value);
}
void DDX_Text(CDataExchange* pDX, int nIDC, HTREEITEM hItem, long& value)
{
if (pDX->m_bSaveAndValidate)
EditTextWithFormat(pDX, nIDC, hItem, _T("%ld"), AFX_IDP_PARSE_INT, &value);
else
EditTextWithFormat(pDX, nIDC, hItem, _T("%ld"), AFX_IDP_PARSE_INT, value);
}
void DDX_Text(CDataExchange* pDX, int nIDC, HTREEITEM hItem, DWORD& value)
{
if (pDX->m_bSaveAndValidate)
EditTextWithFormat(pDX, nIDC, hItem, _T("%lu"), AFX_IDP_PARSE_UINT, &value);
else
EditTextWithFormat(pDX, nIDC, hItem, _T("%lu"), AFX_IDP_PARSE_UINT, value);
}
void DDX_Text(CDataExchange* pDX, int nIDC, HTREEITEM hItem, float& value)
{
EditTextFloatFormat(pDX, nIDC, hItem, &value, value, FLT_DIG);
}
void DDX_Text(CDataExchange* pDX, int nIDC, HTREEITEM hItem, double& value)
{
EditTextFloatFormat(pDX, nIDC, hItem, &value, value, DBL_DIG);
}
void DDX_Text(CDataExchange* pDX, int nIDC, HTREEITEM hItem, CString& sText)
{
HWND hWndCtrl = pDX->PrepareCtrl(nIDC);
CTreeOptionsCtrl* pCtrlTreeOptions = (CTreeOptionsCtrl*) CWnd::FromHandlePermanent(hWndCtrl);
ASSERT(pCtrlTreeOptions);
ASSERT(pCtrlTreeOptions->IsKindOf(RUNTIME_CLASS(CTreeOptionsCtrl)));
if (pDX->m_bSaveAndValidate)
sText = pCtrlTreeOptions->GetEditText(hItem);
else
pCtrlTreeOptions->SetEditText(hItem, sText);
}
///////////////////////////////////////////////////////////////////////////////
// CNumTreeOptionsEdit
IMPLEMENT_DYNCREATE(CNumTreeOptionsEdit, CTreeOptionsEdit)
BEGIN_MESSAGE_MAP(CNumTreeOptionsEdit, CTreeOptionsEdit)
ON_WM_CREATE()
ON_CONTROL_REFLECT(EN_CHANGE, OnEnChange)
END_MESSAGE_MAP()
int CNumTreeOptionsEdit::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
m_bSelf = true;
if (CTreeOptionsEdit::OnCreate(lpCreateStruct) == -1)
return -1;
m_bSelf = false;
return 0;
}
void CNumTreeOptionsEdit::OnEnChange()
{
if (!m_bSelf)
((CTreeOptionsCtrlEx*)m_pTreeCtrl)->NotifyParent(EN_CHANGE, m_hTreeCtrlItem);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -