📄 tabctrldlg.cpp
字号:
// TabCtrlDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Controls.h"
#include "TabCtrlDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define TREE_STYLES (TVS_HASBUTTONS|TVS_HASLINES\
| TVS_LINESATROOT | TVS_SHOWSELALWAYS\
| WS_CHILD)
#define EDIT_STYLES (ES_MULTILINE | ES_WANTRETURN | WS_CHILD) // & !(WS_SYSMENU | WS_CAPTION))
#define TCS_MULTISEL 0x04
/////////////////////////////////////////////////////////////////////////////
// CTabCtrlDlg property page
IMPLEMENT_DYNCREATE(CTabCtrlDlg, CPropertyPage)
CTabCtrlDlg::CTabCtrlDlg() : CPropertyPage(CTabCtrlDlg::IDD)
{
//{{AFX_DATA_INIT(CTabCtrlDlg)
m_Align = 0;
m_TabsLocation = 0;
m_StyleButtons = FALSE;
m_StyleHotTrack = FALSE;
m_StyleMultiline = FALSE;
//}}AFX_DATA_INIT
m_psp.dwFlags &= ~PSP_HASHELP;
}
CTabCtrlDlg::~CTabCtrlDlg()
{
}
void CTabCtrlDlg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTabCtrlDlg)
DDX_Control(pDX, IDC_TABCTRL_STYLE_MULTILINE, m_StyleMultilineCtrl);
DDX_Radio(pDX, IDC_TABCTRL_ALIGN_RIGHTJUSTIFY, m_Align);
DDX_Radio(pDX, IDC_TABCTRL_TABS_TOP, m_TabsLocation);
DDX_Check(pDX, IDC_TABCTRL_STYLE_BUTTONS, m_StyleButtons);
DDX_Check(pDX, IDC_TABCTRL_STYLE_HOTTRACK, m_StyleHotTrack);
DDX_Check(pDX, IDC_TABCTRL_STYLE_MULTILINE, m_StyleMultiline);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTabCtrlDlg, CPropertyPage)
//{{AFX_MSG_MAP(CTabCtrlDlg)
ON_NOTIFY(TCN_SELCHANGE, IDC_TABCTRL_SAMPLETAB, OnSelchangeSampletab)
ON_NOTIFY(TCN_SELCHANGING, IDC_TABCTRL_SAMPLETAB, OnSelchangingSampletab)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_TABCTRL_STYLE_MULTILINE, OnStyleMultiline)
ON_BN_CLICKED(IDC_TABCTRL_TABS_TOP, OnPlaceTabs)
ON_BN_CLICKED(IDC_TABCTRL_ALIGN_FIXEDWIDTH, OnAlignFixedwidth)
ON_BN_CLICKED(IDC_TABCTRL_ALIGN_RIGHTJUSTIFY, OnAlignRightjustify)
ON_BN_CLICKED(IDC_TABCTRL_ALIGN_RAGGEDRIGHT, OnAlignRaggedright)
ON_BN_CLICKED(IDC_TABCTRL_STYLE_BUTTONS, OnStyleButtons)
ON_BN_CLICKED(IDC_TABCTRL_STYLE_HOTTRACK, OnStyleHottrack)
ON_BN_CLICKED(IDC_TABCTRL_TABS_BOTTOM, OnPlaceTabs)
ON_BN_CLICKED(IDC_TABCTRL_TABS_LEFT, OnPlaceTabs)
ON_BN_CLICKED(IDC_TABCTRL_TABS_RIGHT, OnPlaceTabs)
ON_BN_CLICKED(IDC_TABCTRL_SWITCHCONTROLS, OnTabctrlSwitchcontrols)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTabCtrlDlg message handlers
BOOL CTabCtrlDlg::OnInitDialog()
{
CPropertyPage::OnInitDialog();
GetClientRect (m_rcBase);
m_rcBase.right = 60 * m_rcBase.right / 100;
m_rcBase.bottom = m_rcBase.bottom / 2 + 20;
m_rcBase.left += 5;
m_rcBase.top += 10;
m_tab.Create (WS_VISIBLE | TCS_FOCUSNEVER | TCS_SINGLELINE, m_rcBase, this, IDC_TABCTRL_SAMPLETAB);
CFont* font = GetFont ();
m_tab.SetFont (font);
m_Images.Create (16, 16, ILC_MASK, 6, 4);
HICON hIcon = AfxGetApp()->LoadIcon (IDI_REDOFFLED);
m_Images.Add(hIcon);
DeleteObject (hIcon);
hIcon = AfxGetApp()->LoadIcon (IDI_REDONLED);
m_Images.Add(hIcon);
DeleteObject (hIcon);
hIcon = AfxGetApp()->LoadIcon (IDI_GREENOFFLED);
m_Images.Add(hIcon);
DeleteObject (hIcon);
hIcon = AfxGetApp()->LoadIcon (IDI_GREENONLED);
m_Images.Add(hIcon);
DeleteObject (hIcon);
hIcon = AfxGetApp()->LoadIcon (IDI_YELLOWOFFLED);
m_Images.Add(hIcon);
DeleteObject (hIcon);
hIcon = AfxGetApp()->LoadIcon (IDI_YELLOWONLED);
m_Images.Add(hIcon);
DeleteObject (hIcon);
m_tab.SetImageList (&m_Images);
//
// Create the dialog box items. These will be placed
// on the tab page. Other pages will be created with
// the controls in place.
//
m_tabtree.Create(MAKEINTRESOURCE(IDD_TABCTRL_SAMPLEDLG1), GetDlgItem (IDD_PROPPAGE_TABCTRLDLG));
m_tabtree.ModifyStyle (WS_CAPTION, 0, FALSE);
m_tabboxes.Create(MAKEINTRESOURCE(IDD_TABCTRL_SAMPLEDLG2), GetDlgItem (IDD_PROPPAGE_TABCTRLDLG));
m_tabboxes.ModifyStyle (WS_CAPTION, 0, FALSE);
CRect r;
m_tab.GetClientRect (&r);
m_tab.GetWindowRect (m_rcBase);
ScreenToClient (m_rcBase);
m_tab.GetItemRect (0, &m_rcTab);
//
// Create the individual controls. Notice they are
// sized to the client rectangle, which is the client
// area of a tab page.
CRect rcControl;
r = m_rcBase;
r.top += m_rcTab.bottom - m_rcTab.top;
m_list.CreateEx (0, "SysListView32",
NULL, WS_CHILD | LVS_REPORT | WS_BORDER, r.left, r.top,
r.right - r.left, r.bottom - r.top,
this->m_hWnd, NULL, NULL);//IDC_TABLIST);
// m_list.ModifyStyle (WS_CAPTION, 0, TRUE);
DWORD dwStyle = TREE_STYLES;
m_tree.CreateEx (0, "SysTreeView32",
NULL, TREE_STYLES, r.left, r.top,
r.right - r.left, r.bottom - r.top,
this->m_hWnd, NULL, NULL);// IDC_TABTREECTRL);
m_tree.ModifyStyle (WS_CAPTION, 0, TRUE);
m_FirstPageControl = &m_tree;
m_edit.CreateEx (0, "Edit",
"", EDIT_STYLES | WS_CHILD,
r.left, r.right, r.right - r.left,
r.bottom - r.top,
this->m_hWnd, NULL, NULL);// IDC_TABEDIT);
m_edit.SetWindowText ("This is a multiline edit control without scrolling.");
InitializeTree (&m_tree);
//
// Insert the tab pages. Seven in all.
//
AddTabItems ();
AlignTabsAtTop();
//
// Show the first control or dialog
//
m_tab.ShowWindow (true);
m_tree.ShowWindow (SW_NORMAL);
return TRUE;
}
void CTabCtrlDlg::AddTabItems()
{
TC_ITEM TabItem;
memset (&TabItem, '\0', sizeof (TC_ITEM));
TabItem.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM;
TabItem.iImage = 1;
// TabItem.lParam = (long) &m_tree;
TabItem.lParam = (LPARAM) m_FirstPageControl;
TabItem.pszText = "First";
m_tab.InsertItem (0, &TabItem);
TabItem.iImage = 2;
TabItem.lParam = (long) &m_tabboxes;
TabItem.pszText = "Second";
m_tab.InsertItem (1, &TabItem);
TabItem.iImage = 4;
TabItem.pszText = "Third";
TabItem.lParam = (long) &m_list;
m_tab.InsertItem (2, &TabItem);
TabItem.pszText = "Fourth";
TabItem.lParam = (long) &m_edit;
TabItem.iImage = 0;
m_tab.InsertItem (3, &TabItem);
TabItem.pszText = "Fifth";
TabItem.lParam = (long) &m_tabtree;
TabItem.iImage = 2;
m_tab.InsertItem (4, &TabItem);
//
// The next two pages are blank.
//
TabItem.pszText = "Sixth";
TabItem.lParam = 0L;
TabItem.iImage = 4;
m_tab.InsertItem (5, &TabItem);
TabItem.pszText = "Seventh";
TabItem.iImage = 0;
m_tab.InsertItem (6, &TabItem);
}
void CTabCtrlDlg::DeleteTabItems()
{
m_tab.DeleteAllItems ();
}
void CTabCtrlDlg::OnSelchangeSampletab(NMHDR* pNMHDR, LRESULT* pResult)
{
TC_ITEM ti;
CWnd* cDlg;
int result;
// TODO: Add your control notification handler code here
int sel = m_tab.GetCurSel();
ti.mask = TCIF_PARAM | TCIF_IMAGE;
result = m_tab.GetItem (sel, &ti);
cDlg = (CWnd *) ti.lParam;
if (cDlg)
cDlg->ShowWindow (true);
ti.mask = TCIF_IMAGE;
ti.iImage += 1;
m_tab.SetItem (sel, &ti);
*pResult = 0;
}
void CTabCtrlDlg::OnSelchangingSampletab(NMHDR* pNMHDR, LRESULT* pResult)
{
TC_ITEM ti;
CWnd* cDlg;
int result;
// TODO: Add your control notification handler code here
int sel = m_tab.GetCurSel();
ti.mask = TCIF_PARAM | TCIF_IMAGE;
result = m_tab.GetItem (sel, &ti);
cDlg = (CWnd *) ti.lParam;
if (cDlg)
cDlg->ShowWindow (false);
ti.mask = TCIF_IMAGE;
ti.iImage -= 1;
m_tab.SetItem (sel, &ti);
*pResult = 0;
}
//
// All controls that were not created on a dialog box must be
// destroyed here.
//
void CTabCtrlDlg::OnDestroy()
{
m_list.DestroyWindow ();
m_edit.DestroyWindow ();
// m_tree.DestroyWindow ();
m_FirstPageControl->DestroyWindow ();
m_tab.DestroyWindow ();
CPropertyPage::OnDestroy();
// TODO: Add your message handler code here
}
void CTabCtrlDlg::InitializeTree(CTreeCtrl * tree)
{
TV_INSERTSTRUCT TreeItem;
// TODO: Add extra initialization here
TreeItem.hParent = TVI_ROOT;
TreeItem.hInsertAfter = TVI_LAST;
TreeItem.item.mask = TVIF_TEXT | TVIF_PARAM;
TreeItem.item.pszText = "Animals";
TreeItem.item.lParam = 0;
HTREEITEM hAnimal1 = tree->InsertItem(&TreeItem);
TreeItem.item.pszText = "Plants";
TreeItem.item.lParam = 1;
HTREEITEM hPlants1 = tree->InsertItem(&TreeItem);
TreeItem.item.mask = TVIF_TEXT | TVIF_PARAM;
TreeItem.item.iImage = -1;
TreeItem.item.iSelectedImage = -1;
TreeItem.hParent = hAnimal1;
TreeItem.item.pszText = "Domesticated";
TreeItem.item.lParam = 100;
HTREEITEM hAnimal2 = tree->InsertItem(&TreeItem);
TreeItem.item.pszText = "Wild and Free";
TreeItem.item.lParam = 100;
HTREEITEM hAnimal3 = tree->InsertItem(&TreeItem);
TreeItem.hParent = hAnimal2;
TreeItem.item.pszText = "Dogs";
TreeItem.item.lParam = 101;
tree->InsertItem(&TreeItem);
TreeItem.item.pszText = "Cats";
TreeItem.item.lParam = 102;
tree->InsertItem(&TreeItem);
TreeItem.item.pszText = "Hamsters";
TreeItem.item.lParam = 103;
tree->InsertItem(&TreeItem);
TreeItem.hParent = hAnimal3;
TreeItem.item.pszText = "Tigers";
TreeItem.item.lParam = 111;
tree->InsertItem(&TreeItem);
TreeItem.item.pszText = "Lions";
TreeItem.item.lParam = 112;
tree->InsertItem(&TreeItem);
TreeItem.item.pszText = "Gerbils";
TreeItem.item.lParam = 113;
tree->InsertItem(&TreeItem);
}
void CTabCtrlDlg::InitializeList(CListCtrl *list)
{
char *szTitles [] =
{
"Life Form",
"Type",
"Status"
};
#define TITLES (sizeof(szTitles)/sizeof(char *))
LV_COLUMN lc;
CRect rc;
list->GetWindowRect (rc);
int nWidth = (rc.right - rc.left) / 3;
memset (&lc, '\0', sizeof (LV_COLUMN));
lc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
for (int sub = 0; sub < TITLES; ++sub)
{
lc.pszText = szTitles[sub];
lc.cx = nWidth;
lc.iSubItem = sub;
list->InsertColumn (sub, &lc);
}
}
void CTabCtrlDlg::OnStyleMultiline()
{
UpdateData (TRUE);
if (m_StyleMultiline == TRUE)
{
m_tab.ModifyStyle (TCS_SINGLELINE | TCS_MULTISEL, TCS_MULTILINE, TRUE);
m_tab.Invalidate ();
}
else
{
m_tab.ModifyStyle (TCS_MULTILINE | TCS_MULTISEL, TCS_SINGLELINE, TRUE);
m_tab.Invalidate ();
}
switch (m_TabsLocation)
{
case 0: // At the top
AlignTabsAtTop();
break;
case 1: // At the bottom
AlignTabsAtBottom ();
break;
case 2: // At the left
AlignTabsAtLeft();
break;
case 3: // At the right
AlignTabsAtRight();
break;
}
TC_ITEM ti;
int nSel = m_tab.GetCurSel ();
ti.mask = TCIF_PARAM | TCIF_IMAGE;
m_tab.GetItem (nSel, &ti);
CWnd *cDlg = (CWnd *) ti.lParam;
if (cDlg != NULL)
cDlg->Invalidate ();
}
void CTabCtrlDlg::OnPlaceTabs()
{
DWORD dwStyle, dwStyleEx;
UpdateData (TRUE);
switch (m_TabsLocation)
{
case 0: // At the top
m_tab.ModifyStyle (TCS_BOTTOM | TCS_VERTICAL, 0, TRUE);
dwStyle = m_tab.GetStyle();
dwStyleEx = m_tab.GetExStyle();
RecreateWindow (dwStyle, dwStyleEx);
m_StyleMultilineCtrl.EnableWindow(TRUE);
AlignTabsAtTop();
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -