tdlcolumnlistbox.cpp

来自「管理项目进度工具的原代码」· C++ 代码 · 共 204 行

CPP
204
字号
// TDColumnListBox.cpp : implementation file
//

#include "stdafx.h"
#include "resource.h"
#include "TDLColumnListBox.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define WM_INITLISTBOX (WM_APP+1)

/////////////////////////////////////////////////////////////////////////////
// CTDLColumnListBox

CTDLColumnListBox::CTDLColumnListBox()
{
	// same order as enum
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_POS,		TDLBC_POSITION,		TDCC_POSITION,	TRUE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_ID,		TDLBC_ID,			TDCC_ID,		FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_PRIORITY,TDLBC_PRIORITY,		TDCC_PRIORITY,	TRUE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_PERCENT,	TDLBC_PERCENT,		TDCC_PERCENT,	TRUE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_TIMEEST,	TDLBC_TIMEEST,		TDCC_TIMEEST,	FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_TIMESPENT, TDLBC_TIMESPENT,	TDCC_TIMESPENT, FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_TRACKTIME, TDLBC_TRACKTIME,	TDCC_TRACKTIME, FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_CREATEDBY, TDLBC_CREATEDBY,	TDCC_CREATEDBY, FALSE));
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_CREATEDATE, TDLBC_CREATIONDATE,TDCC_CREATIONDATE, FALSE));
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_STARTDATE, TDLBC_STARTDATE,	TDCC_STARTDATE, FALSE));
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_DUEDATE,	TDLBC_DUEDATE,		TDCC_DUEDATE,	TRUE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_DONEDATE,TDLBC_DONEDATE,		TDCC_DONEDATE,	FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_ALLOCTO,	TDLBC_ALLOCTO,		TDCC_ALLOCTO,	TRUE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_ALLOCBY,	TDLBC_ALLOCBY,		TDCC_ALLOCBY,	FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_STATUS,	TDLBC_STATUS,		TDCC_STATUS,	FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_CATEGORY,TDLBC_CATEGORY,		TDCC_CATEGORY,	FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_FILEREF,	TDLBC_FILEREF,		TDCC_FILEREF,	FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_FLAG,	TDLBC_FLAG,			TDCC_FLAG,		FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_DONE,	TDLBC_DONE,			TDCC_DONE,		FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_MODIFYDATE, TDLBC_MODIFYDATE,TDCC_LASTMOD,	FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_RISK,	TDLBC_RISK,			TDCC_RISK,		FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_EXTERNALID, TDLBC_EXTERNALID,TDCC_EXTERNALID, FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_COST,	TDLBC_COST,			TDCC_COST,		FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_DEPENDS,	TDLBC_DEPENDS,		TDCC_DEPENDENCY, FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_RECURRENCE, TDLBC_RECURRENCE,TDCC_RECURRENCE, FALSE)); 
	m_aColumns.Add(COLUMNVIS(IDS_TDLBC_VERSION,	TDLBC_VERSION,		TDCC_VERSION,	FALSE)); 
}

CTDLColumnListBox::~CTDLColumnListBox()
{
}


BEGIN_MESSAGE_MAP(CTDLColumnListBox, CCheckListBox)
	//{{AFX_MSG_MAP(CTDLColumnListBox)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
	ON_CONTROL_REFLECT_EX(CLBN_CHKCHANGE, OnReflectCheckChange)
	ON_MESSAGE(WM_INITLISTBOX, OnInitListBox)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTDLColumnListBox message handlers

void CTDLColumnListBox::PreSubclassWindow() 
{
	CCheckListBox::PreSubclassWindow();

	// too early to initialize the list box so we post a message
	PostMessage(WM_INITLISTBOX);
}

int CTDLColumnListBox::FindColumn(TDLB_COLUMN nCol) const
{
	int nIndex = m_aColumns.GetSize();
	
	while (nIndex--)
	{
		if (m_aColumns[nIndex].nCol == nCol)
			return nIndex;
	}

	ASSERT(0);
	return -1;
}

int CTDLColumnListBox::FindColumn(TDC_COLUMN nCol) const
{
	int nIndex = m_aColumns.GetSize();
	
	while (nIndex--)
	{
		if (m_aColumns[nIndex].nTDCCol == nCol)
			return nIndex;
	}

	ASSERT(0);
	return -1;
}

void CTDLColumnListBox::SetAllColumnsVisible(BOOL bVisible)
{
	int nIndex = m_aColumns.GetSize();
	
	while (nIndex--)
	{
		m_aColumns[nIndex].bVisible = bVisible;

		if (GetSafeHwnd())
			SetCheck(nIndex, bVisible ? 1 : 0);
	}
}

void CTDLColumnListBox::SetColumnVisible(TDLB_COLUMN nCol, BOOL bVisible)
{
	int nIndex = FindColumn(nCol);
	
	if (nIndex != -1)
	{
		m_aColumns[nIndex].bVisible = bVisible;

		if (GetSafeHwnd())
			SetCheck(nIndex, bVisible ? 1 : 0);
	}
}

BOOL CTDLColumnListBox::IsColumnVisible(TDLB_COLUMN nCol) const
{
	int nIndex = FindColumn(nCol);
	
	if (nIndex != -1)
		return m_aColumns[nIndex].bVisible;

	return FALSE; // not found
}

BOOL CTDLColumnListBox::OnReflectCheckChange()
{
	// update all check states because we don't know which one changed
	int nIndex = m_aColumns.GetSize();
	
	while (nIndex--)
		m_aColumns[nIndex].bVisible = GetCheck(nIndex);

	// continue routing
	return FALSE;
}

LRESULT CTDLColumnListBox::OnInitListBox(WPARAM /*wp*/, LPARAM /*lp*/)
{
	ASSERT (GetCount() == 0);

	for (int nIndex = 0; nIndex < (int)m_aColumns.GetSize(); nIndex++)
	{
		COLUMNVIS& cs = m_aColumns[nIndex];

		int nPos = AddString(cs.sName); // same order as enum
		SetCheck(nPos, cs.bVisible ? 1 : 0);

		// note: we can't use SetItemData because CCheckListBox uses it
	}

	return 0L;
}

void CTDLColumnListBox::SetVisibleColumns(const CTDCColumnArray& aColumns)
{
	SetAllColumnsVisible(FALSE);

	int nCol = (int)aColumns.GetSize();
	
	while (nCol--)
	{
		int nIndex = FindColumn(aColumns[nCol]);

		if (nIndex != -1)
		{
			m_aColumns[nIndex].bVisible = TRUE;

			if (GetSafeHwnd())
				SetCheck(nIndex, 1);
		}
	}
}

int CTDLColumnListBox::GetVisibleColumns(CTDCColumnArray& aColumns) const
{
	aColumns.RemoveAll();

	int nIndex = m_aColumns.GetSize();
	
	while (nIndex--)
	{
		COLUMNVIS cs = m_aColumns[nIndex];

		if (cs.bVisible)
			aColumns.Add(cs.nTDCCol);
	}

	return aColumns.GetSize();

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?