📄 listctrldlg.cpp
字号:
// ListCtrlDlg.cpp : implementation file
//
#include "stdafx.h"
#include "Controls.h"
#include "ListCtrlDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define MAX_STRING 256
static PLANET Planets[] =
{
"Mercury", "-- The Messenger", 579, 58, 0, 0, 38 * 12756 / 100, 0,
"Venus", "-- The Nearest Planet", 1082, 243, 0, 0, 95 * 12756 / 100, 1,
"Earth", "-- Our Home Planet", 1302, 0, 23, 56, 100 * 12756 / 100, 2,
"Mars", "-- The Red Planet", 2279, 1, 0, 37, 53 * 12756 / 100, 3,
"Jupiter", "-- The Giant Planet", 7790, 0, 9, 55, 1121 * 12756 / 100, 4,
"Saturn", "-- The Ringed Planet", 14320, 0, 10, 40, 914 * 12756 / 100, 5,
"Uranus", "-- The Green Giant", 28000, 0, 17, 14, 400 * 12756 / 100, 6,
"Neptune", "-- The Blue Planet", 45000, 0, 16, 7, 390 * 12756 / 100, 7,
"Pluto", "-- The Farthest Planet", 59000, 6, 9, 17, 18 * 12756 / 100, 8
};
#define PLANETS (sizeof(Planets)/sizeof(PLANET))
#undef STATEMASK
// #define STATEMASK 0x0100 | LVIS_CUT|LVIS_DROPHILITED|LVIS_FOCUSED|LVIS_SELECTED
#define STATEMASK 0
#define _USETEXTCALLBACK
//
// The following is needed only if you are NOT using
// LPSTR_TEXTCALLBACK and you need to sort
//
static CListCtrlEx *g_pctlList;
/////////////////////////////////////////////////////////////////////////////
// CListCtrlDlg property page
IMPLEMENT_DYNCREATE(CListCtrlDlg, CPropertyPage)
CListCtrlDlg::CListCtrlDlg() : CPropertyPage(CListCtrlDlg::IDD)
{
//{{AFX_DATA_INIT(CListCtrlDlg)
m_nListSort = 0;
m_nHeaderAlign = 0;
m_bFullDrag = FALSE;
m_bFullRowSel = FALSE;
m_bHotTrack = FALSE;
m_bNoColHeader = FALSE;
m_bNoLabelWrap = FALSE;
m_bNoSortHeader = FALSE;
m_bShowSelAlways = FALSE;
m_bSingleSel = FALSE;
m_bText = TRUE;
m_bIcon = FALSE;
m_nListMode = 0;
m_nIconAlign = -1;
m_bBitmap = FALSE;
m_bButtons = FALSE;
m_bDisableHeader = FALSE;
//}}AFX_DATA_INIT
m_psp.dwFlags &= ~PSP_HASHELP;
m_hBmpPlanet = NULL;
m_hBmpOrbit = NULL;
m_hBmpRotate = NULL;
m_hBmpDiameter = NULL;
}
CListCtrlDlg::~CListCtrlDlg()
{
if (m_hBmpPlanet != NULL)
DeleteObject (m_hBmpPlanet);
if (m_hBmpOrbit != NULL)
DeleteObject (m_hBmpOrbit);
if (m_hBmpRotate != NULL)
DeleteObject (m_hBmpRotate);
if (m_hBmpDiameter)
DeleteObject (m_hBmpDiameter);
}
void CListCtrlDlg::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CListCtrlDlg)
DDX_Control(pDX, IDC_LISTCTRL_LISTCTRL, m_ctlList);
DDX_Radio(pDX, IDC_LISTCTRL_NOSORT, m_nListSort);
DDX_Radio(pDX, IDC_LISTCTRL_LEFT, m_nHeaderAlign);
DDX_Check(pDX, IDC_LISTCTRL_FULLDRAG, m_bFullDrag);
DDX_Check(pDX, IDC_LISTCTRL_FULLROWSEL, m_bFullRowSel);
DDX_Check(pDX, IDC_LISTCTRL_HOTTRACK, m_bHotTrack);
DDX_Check(pDX, IDC_LISTCTRL_NOCOLUMNHEADER, m_bNoColHeader);
DDX_Check(pDX, IDC_LISTCTRL_NOLABELWRAP, m_bNoLabelWrap);
DDX_Check(pDX, IDC_LISTCTRL_NOSORTHEADER, m_bNoSortHeader);
DDX_Check(pDX, IDC_LISTCTRL_SHOWSELALWAYS, m_bShowSelAlways);
DDX_Check(pDX, IDC_LISTCTRL_SINGLESEL, m_bSingleSel);
DDX_Check(pDX, IDC_LISTCTRL_TEXT, m_bText);
DDX_Check(pDX, IDC_LISTCTRL_ICON, m_bIcon);
DDX_Radio(pDX, IDC_LIST_LARGEICON, m_nListMode);
DDX_Radio(pDX, IDC_LISTCTRL_ALIGNLEFT, m_nIconAlign);
DDX_Check(pDX, IDC_LISTCTRL_BITMAP, m_bBitmap);
DDX_Check(pDX, IDC_LISTCTRL_BUTTONS, m_bButtons);
DDX_Check(pDX, IDC_LISTCTRL_DISABLEHEADER, m_bDisableHeader);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CListCtrlDlg, CPropertyPage)
//{{AFX_MSG_MAP(CListCtrlDlg)
ON_BN_CLICKED(IDC_LISTCTRL_ALIGNLEFT, OnIconAlign)
ON_BN_CLICKED(IDC_LISTCTRL_SORTASCENDING, OnListSort)
ON_BN_CLICKED(IDC_LISTCTRL_LEFT, OnHeaderAlign)
ON_BN_CLICKED(IDC_LISTCTRL_NOLABELWRAP, OnListctrlNolabelwrap)
ON_BN_CLICKED(IDC_LISTCTRL_FULLROWSEL, OnListctrlFullrowsel)
ON_BN_CLICKED(IDC_LISTCTRL_NOSORTHEADER, OnListctrlNosortheader)
ON_BN_CLICKED(IDC_LISTCTRL_NOCOLUMNHEADER, OnListctrlNocolumnheader)
ON_BN_CLICKED(IDC_LISTCTRL_SINGLESEL, OnListctrlSinglesel)
ON_BN_CLICKED(IDC_LISTCTRL_SHOWSELALWAYS, OnListctrlShowselalways)
ON_BN_CLICKED(IDC_LISTCTRL_HOTTRACK, OnListctrlHottrack)
ON_BN_CLICKED(IDC_LISTCTRL_FULLDRAG, OnListctrlFulldrag)
ON_BN_CLICKED(IDC_LISTCTRL_BUTTONS, OnListctrlButtons)
ON_BN_CLICKED(IDC_LISTCTRL_TEXT, OnListctrlText)
ON_BN_CLICKED(IDC_LISTCTRL_ICON, OnListctrlIcon)
ON_BN_CLICKED(IDC_LISTCTRL_BITMAP, OnListctrlBitmap)
ON_BN_CLICKED(IDC_LISTCTRL_DISABLEHEADER, OnListctrlDisableheader)
ON_NOTIFY(LVN_GETDISPINFO, IDC_LISTCTRL_LISTCTRL, OnGetdispinfoListctrlListctrl)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_LISTCTRL_LISTCTRL, OnColumnclickListctrlListctrl)
ON_WM_DESTROY()
ON_NOTIFY(NM_CLICK, IDC_LISTCTRL_LISTCTRL, OnClickListctrlListctrl)
ON_BN_CLICKED(IDC_LIST_LARGEICON, OnListMode)
ON_BN_CLICKED(IDC_LIST_LIST, OnListMode)
ON_BN_CLICKED(IDC_LIST_REPORT, OnListMode)
ON_BN_CLICKED(IDC_LIST_SMALLICON, OnListMode)
ON_BN_CLICKED(IDC_LISTCTRL_ALIGNTOP, OnIconAlign)
ON_BN_CLICKED(IDC_LISTCTRL_AUTOARRANGE, OnIconAlign)
ON_BN_CLICKED(IDC_LISTCTRL_SORTDESCENDING, OnListSort)
ON_BN_CLICKED(IDC_LISTCTRL_CENTER, OnHeaderAlign)
ON_BN_CLICKED(IDC_LISTCTRL_RIGHT, OnHeaderAlign)
ON_BN_CLICKED(IDC_LISTCTRL_NOSORT, OnListSort)
//}}AFX_MSG_MAP
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnToolTipNotify)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CListCtrlDlg message handlers
BOOL CListCtrlDlg::OnInitDialog()
{
CPropertyPage::OnInitDialog();
/*
TBBUTTON ButtonData[4] =
{
0, ID_LIST_LARGEICON, TBSTATE_ENABLED | TBSTATE_CHECKED, TBSTYLE_BUTTON | TBSTYLE_CHECKGROUP, 0, 0, 0, -1,
1, ID_LIST_SMALLICON, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_CHECKGROUP, 0, 0, 0, -1,
2, ID_LIST_LIST, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_CHECKGROUP, 0, 0, 0, -1,
3, ID_LIST_REPORT, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_CHECKGROUP, 0, 0, 0, -1
};
*/
CImageList Images;
Images.Create (IDB_LISTMODES, 16, 4, GetSysColor (COLOR_BTNFACE));
((CButton *)GetDlgItem(IDC_LIST_LARGEICON))->SetIcon (Images.ExtractIcon (0));
((CButton *)GetDlgItem(IDC_LIST_SMALLICON))->SetIcon (Images.ExtractIcon (1));
((CButton *)GetDlgItem(IDC_LIST_LIST))->SetIcon (Images.ExtractIcon (2));
((CButton *)GetDlgItem(IDC_LIST_REPORT))->SetIcon (Images.ExtractIcon (3));
EnableToolTips ();
//
// Load the bitmaps for the list control header.
//
HINSTANCE hInst = AfxGetInstanceHandle ();
m_hBmpPlanet = (HBITMAP) LoadImage (hInst,
MAKEINTRESOURCE(IDB_LISTCTRL_PLANET), IMAGE_BITMAP, 80, 16, LR_DEFAULTCOLOR);
m_hBmpOrbit = (HBITMAP) LoadImage (hInst,
MAKEINTRESOURCE(IDB_LISTCTRL_ORBIT), IMAGE_BITMAP, 80, 16, LR_DEFAULTCOLOR);
m_hBmpRotate = (HBITMAP) LoadImage (hInst,
MAKEINTRESOURCE(IDB_LISTCTRL_DAYNIGHT), IMAGE_BITMAP, 80, 16, LR_DEFAULTCOLOR);
m_hBmpDiameter = (HBITMAP) LoadImage (hInst,
MAKEINTRESOURCE(IDB_LISTCTRL_DIAMETER), IMAGE_BITMAP, 80, 16, LR_DEFAULTCOLOR);
//
// If you are planning to modify the header at any time,
// ALWAYS create the control in report view, then change
// the style to what you want in this function. This will
// assure the header gets created with the control.
// Otherwise, you might get a rude shock (called an
// "access violation") when you try to modify the header.
//
m_ctlList.ModifyStyle (LVS_SMALLICON | LVS_LIST | LVS_REPORT, LVS_ICON, TRUE);
LoadListControl();
//
// Set the global variable to point to the list control.
//
g_pctlList = &m_ctlList;
return TRUE;
}
BOOL CListCtrlDlg::OnToolTipNotify(UINT nID, NMHDR *pTTTStruct, LRESULT *pResult)
{
TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pTTTStruct;
UINT nCtrlID =pTTTStruct->idFrom;
if (pTTT->uFlags & TTF_IDISHWND)
{
// idFrom is actually the HWND of the tool
nCtrlID = ::GetDlgCtrlID((HWND)nCtrlID);
if(nCtrlID)
{
TCHAR szTip[MAX_STRING];
if (!LoadString (AfxGetInstanceHandle (),
nCtrlID, szTip, MAX_STRING))
return (FALSE);
char *pszShort = strchr (szTip, '\n');
if (pszShort != NULL)
pTTT->lpszText = pszShort + 1;
else
pTTT->lpszText = MAKEINTRESOURCE(nCtrlID);
pTTT->hinst = AfxGetResourceHandle();
return(TRUE);
}
}
return(FALSE);
}
void CListCtrlDlg::OnListMode()
{
UpdateData (TRUE);
switch (m_nListMode)
{
case 0: // ID_LIST_LARGEICON
m_ctlList.ModifyStyle (LVS_SMALLICON | LVS_LIST | LVS_REPORT | LVS_OWNERDRAWFIXED, LVS_ICON, TRUE);
break;
case 1: // ID_LIST_SMALLICON
m_ctlList.ModifyStyle (LVS_ICON | LVS_LIST | LVS_REPORT | LVS_OWNERDRAWFIXED, LVS_SMALLICON, TRUE);
break;
case 2: // ID_LIST_LIST
m_ctlList.ModifyStyle (LVS_ICON | LVS_SMALLICON | LVS_REPORT | LVS_OWNERDRAWFIXED, LVS_LIST, TRUE);
break;
case 3: // ID_LIST_REPORT
m_ctlList.ModifyStyle (LVS_ICON | LVS_LIST | LVS_SMALLICON, LVS_REPORT, TRUE);
if (m_bFullRowSel)
m_ctlList.ModifyStyle (0, LVS_OWNERDRAWFIXED, TRUE);
break;
}
}
void CListCtrlDlg::OnIconAlign()
{
UpdateData (TRUE);
switch (m_nIconAlign)
{
case 0: // Align Left
m_ctlList.ModifyStyle (LVS_ALIGNTOP | LVS_AUTOARRANGE, LVS_ALIGNLEFT, TRUE);
break;
case 1: // Align Top
m_ctlList.ModifyStyle (LVS_ALIGNLEFT | LVS_AUTOARRANGE, LVS_ALIGNTOP, TRUE);
break;
case 2: // Auto Arrange
m_ctlList.ModifyStyle (LVS_ALIGNTOP | LVS_ALIGNLEFT, LVS_AUTOARRANGE, TRUE);
break;
}
}
void CListCtrlDlg::OnListSort()
{
UpdateData (TRUE);
switch (m_nListSort)
{
case 0: // No Sort
m_ctlList.ModifyStyle (LVS_SORTDESCENDING | LVS_SORTASCENDING, 0, TRUE);
break;
case 1: // Sort Ascending
m_ctlList.ModifyStyle (LVS_SORTDESCENDING, LVS_SORTASCENDING, TRUE);
break;
case 2: // Align Top
m_ctlList.ModifyStyle (LVS_SORTASCENDING, LVS_SORTDESCENDING, TRUE);
break;
}
}
void CListCtrlDlg::OnHeaderAlign()
{
UpdateData (TRUE);
HDITEM hi;
memset (&hi, '\0', sizeof (HDITEM));
CHeaderCtrl *header = m_ctlList.GetHeaderCtrl ();
hi.mask = HDI_FORMAT;
header->GetItem (0, &hi);
hi.fmt &= ~(HDF_LEFT | HDF_RIGHT | HDF_CENTER);
switch (m_nHeaderAlign)
{
case 0: // Left
hi.fmt |= HDF_LEFT;
break;
case 1: // Right
hi.fmt |= HDF_RIGHT;
break;
case 2: // Center
hi.fmt |= HDF_CENTER;
break;
default:
return;
}
header->SetItem (0, &hi);
header->SetItem (1, &hi);
header->SetItem (2, &hi);
}
void CListCtrlDlg::OnListctrlNolabelwrap()
{
UpdateData (TRUE);
if (m_bNoLabelWrap)
m_ctlList.ModifyStyle (0, LVS_NOLABELWRAP, TRUE);
else
m_ctlList.ModifyStyle (LVS_NOLABELWRAP, 0, TRUE);
}
void CListCtrlDlg::OnListctrlFullrowsel()
{
UpdateData (TRUE);
int nType = m_ctlList.GetStyle () & LVS_TYPEMASK;
if (nType != LVS_REPORT)
return;
int nSel = GetSelectedItem();
if (m_bFullRowSel)
m_ctlList.ModifyStyle (0, LVS_OWNERDRAWFIXED, TRUE);
else
m_ctlList.ModifyStyle (LVS_OWNERDRAWFIXED, 0, TRUE);
m_ctlList.SetFocus ();
SetSelectedItem (nSel);
}
void CListCtrlDlg::OnListctrlNosortheader()
{
UpdateData (TRUE);
if (m_bNoSortHeader)
{
m_ctlList.ModifyStyle (0, LVS_NOSORTHEADER, TRUE);
m_bButtons = FALSE;
m_bHotTrack = FALSE;
m_ctlList.GetHeaderCtrl()->ModifyStyle (HDS_BUTTONS, 0, TRUE);
::EnableWindow (GetDlgItem (IDC_LISTCTRL_HOTTRACK)->m_hWnd, FALSE);
::EnableWindow (GetDlgItem (IDC_LISTCTRL_BUTTONS)->m_hWnd, FALSE);
UpdateData (FALSE);
}
else
{
m_ctlList.ModifyStyle (LVS_NOSORTHEADER, 0, TRUE);
::EnableWindow (GetDlgItem (IDC_LISTCTRL_BUTTONS)->m_hWnd, TRUE);
}
}
void CListCtrlDlg::OnListctrlNocolumnheader()
{
UpdateData (TRUE);
if (m_bNoColHeader)
m_ctlList.ModifyStyle (0, LVS_NOCOLUMNHEADER, TRUE);
else
m_ctlList.ModifyStyle (LVS_NOCOLUMNHEADER, 0, TRUE);
}
void CListCtrlDlg::OnListctrlSinglesel()
{
UpdateData (TRUE);
if (m_bSingleSel)
m_ctlList.ModifyStyle (0, LVS_SINGLESEL, TRUE);
else
m_ctlList.ModifyStyle (LVS_SINGLESEL, 0, TRUE);
}
void CListCtrlDlg::OnListctrlShowselalways()
{
UpdateData (TRUE);
if (m_bShowSelAlways)
m_ctlList.ModifyStyle (0, LVS_SHOWSELALWAYS, TRUE);
else
m_ctlList.ModifyStyle (LVS_SHOWSELALWAYS, 0, TRUE);
//
// Give the list control the focus, then yank it
// back. This will make the style take effect.
//
CWnd *wnd = m_ctlList.SetFocus();
wnd->SetFocus();
}
void CListCtrlDlg::OnListctrlHottrack()
{
UpdateData (TRUE);
if (m_bHotTrack)
{
m_ctlList.GetHeaderCtrl()->ModifyStyle (0, HDS_HOTTRACK, TRUE);
}
else
{
m_ctlList.GetHeaderCtrl()->ModifyStyle (HDS_HOTTRACK, 0, TRUE);
}
}
void CListCtrlDlg::OnListctrlFulldrag()
{
UpdateData (TRUE);
if (m_bFullDrag)
{
m_ctlList.GetHeaderCtrl()->ModifyStyle (0, HDS_FULLDRAG, TRUE);
}
else
{
m_ctlList.GetHeaderCtrl()->ModifyStyle (HDS_FULLDRAG, 0, TRUE);
}
}
void CListCtrlDlg::OnListctrlButtons()
{
UpdateData (TRUE);
if (m_bButtons)
{
::EnableWindow (GetDlgItem (IDC_LISTCTRL_HOTTRACK)->m_hWnd, TRUE);
m_ctlList.GetHeaderCtrl()->ModifyStyle (0, HDS_BUTTONS, TRUE);
}
else
{
::EnableWindow (GetDlgItem (IDC_LISTCTRL_HOTTRACK)->m_hWnd, FALSE);
m_ctlList.GetHeaderCtrl()->ModifyStyle (HDS_BUTTONS, 0, TRUE);
}
}
void CListCtrlDlg::OnListctrlText()
{
UpdateData (TRUE);
HDITEM hi;
memset (&hi, '\0', sizeof (HDITEM));
CHeaderCtrl *header = m_ctlList.GetHeaderCtrl ();
hi.mask = HDI_FORMAT;
header->GetItem (0, &hi);
if (m_bText)
{
hi.mask = HDI_FORMAT;
hi.fmt |= HDF_STRING;
hi.iImage = 0;
header->SetItem (0, &hi);
hi.iImage = 1;
header->SetItem (1, &hi);
hi.iImage = 2;
header->SetItem (2, &hi);
hi.iImage = 2;
header->SetItem (3, &hi);
}
else
{
hi.mask = HDI_FORMAT;
hi.fmt &= ~HDF_STRING;
header->SetItem (0, &hi);
header->SetItem (1, &hi);
header->SetItem (2, &hi);
header->SetItem (3, &hi);
}
}
void CListCtrlDlg::OnListctrlIcon()
{
UpdateData (TRUE);
HDITEM hi;
memset (&hi, '\0', sizeof (HDITEM));
CHeaderCtrl *header = m_ctlList.GetHeaderCtrl ();
hi.mask = HDI_FORMAT;
header->GetItem (0, &hi);
if (m_bIcon)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -