⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 listctrldlg.cpp

📁 VC源代码大全(精华版)
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -