findnumpage.cpp

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

CPP
249
字号
// FindNumPage.cpp : implementation file
//

#include "stdafx.h"
#include "todolist.h"
#include "FindNumPage.h"
#include "..\shared\misc.h"

#include <float.h>

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

/////////////////////////////////////////////////////////////////////////////
// CFindNumPage property page

enum { THISNUMBER, MORETHAN, LESSTHAN, BETWEEN };

const LPCTSTR MASKNEGINT = "0123456789-";
const LPCTSTR MASKPOSINT = "0123456789";
const LPCTSTR MASKNEGFLT = ".0123456789-";
const LPCTSTR MASKPOSFLT = ".0123456789";

IMPLEMENT_DYNCREATE(CFindNumPage, CPropertyPage)

CFindNumPage::CFindNumPage(BOOL bInteger, BOOL bAllowNegative) : 
	CPropertyPage(CFindNumPage::IDD), m_bAllowNegative(bAllowNegative)
{
	//{{AFX_DATA_INIT(CFindNumPage)
	m_nNumberOption = MORETHAN;
	m_sMoreThanValue = _T("");
	m_sLessThanValue = _T("");
	m_sStartValue = _T("");
	m_sEndValue = _T("");
	m_sThisValue = _T("");
	//}}AFX_DATA_INIT

	if (bInteger)
	{
		if (bAllowNegative)
		{
			m_eThis.SetMask(MASKNEGINT);
			m_eMoreThan.SetMask(MASKNEGINT);
			m_eLessThan.SetMask(MASKNEGINT);
			m_eStart.SetMask(MASKNEGINT);
			m_eEnd.SetMask(MASKNEGINT);
		}
		else
		{
			m_eThis.SetMask(MASKPOSINT);
			m_eMoreThan.SetMask(MASKPOSINT);
			m_eLessThan.SetMask(MASKPOSINT);
			m_eStart.SetMask(MASKPOSINT);
			m_eEnd.SetMask(MASKPOSINT);
		}
	}
	else // float
	{
		if (bAllowNegative)
		{
			m_eThis.SetMask(MASKNEGFLT, ME_LOCALIZEDECIMAL);
			m_eMoreThan.SetMask(MASKNEGFLT, ME_LOCALIZEDECIMAL);
			m_eLessThan.SetMask(MASKNEGFLT, ME_LOCALIZEDECIMAL);
			m_eStart.SetMask(MASKNEGFLT, ME_LOCALIZEDECIMAL);
			m_eEnd.SetMask(MASKNEGFLT, ME_LOCALIZEDECIMAL);
		}
		else
		{
			m_eThis.SetMask(MASKPOSFLT, ME_LOCALIZEDECIMAL);
			m_eMoreThan.SetMask(MASKPOSFLT, ME_LOCALIZEDECIMAL);
			m_eLessThan.SetMask(MASKPOSFLT, ME_LOCALIZEDECIMAL);
			m_eStart.SetMask(MASKPOSFLT, ME_LOCALIZEDECIMAL);
			m_eEnd.SetMask(MASKPOSFLT, ME_LOCALIZEDECIMAL);
		}
	}
}

CFindNumPage::~CFindNumPage()
{
}

void CFindNumPage::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFindNumPage)
	DDX_Control(pDX, IDC_THISNUMBER, m_eThis);
	DDX_Control(pDX, IDC_NUMBEREND, m_eEnd);
	DDX_Control(pDX, IDC_NUMBERSTART, m_eStart);
	DDX_Control(pDX, IDC_LESSTHANNUMBER, m_eLessThan);
	DDX_Control(pDX, IDC_MORETHANNUMBER, m_eMoreThan);
	DDX_Radio(pDX, IDC_THIS, m_nNumberOption);
	DDX_Text(pDX, IDC_MORETHANNUMBER, m_sMoreThanValue);
	DDX_Text(pDX, IDC_LESSTHANNUMBER, m_sLessThanValue);
	DDX_Text(pDX, IDC_NUMBERSTART, m_sStartValue);
	DDX_Text(pDX, IDC_NUMBEREND, m_sEndValue);
	DDX_Text(pDX, IDC_THISNUMBER, m_sThisValue);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CFindNumPage, CPropertyPage)
	//{{AFX_MSG_MAP(CFindNumPage)
	ON_BN_CLICKED(IDC_MORETHAN, OnChangeOption)
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_LESSTHAN, OnChangeOption)
	ON_BN_CLICKED(IDC_BETWEEN, OnChangeOption)
	ON_BN_CLICKED(IDC_THIS, OnChangeOption)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFindNumPage message handlers

BOOL CFindNumPage::OnInitDialog() 
{
	CPropertyPage::OnInitDialog();

	CString sRegKey = GetRegKey();
	
	m_nNumberOption = AfxGetApp()->GetProfileInt(sRegKey, "LastNumOption", m_nNumberOption);
	m_sThisValue = AfxGetApp()->GetProfileString(sRegKey, "LastThisValue");
	m_sMoreThanValue = AfxGetApp()->GetProfileString(sRegKey, "LastMoreThanValue");
	m_sLessThanValue = AfxGetApp()->GetProfileString(sRegKey, "LastLessThanValue");
	m_sStartValue = AfxGetApp()->GetProfileString(sRegKey, "LastStartValue");
	m_sEndValue = AfxGetApp()->GetProfileString(sRegKey, "LastEndValue");

	UpdateData(FALSE);
	
	EnableControls(m_nNumberOption);
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CFindNumPage::GetNumberRange(int& nFrom, int& nTo)
{
	if (GetSafeHwnd())
		UpdateData();

	switch (m_nNumberOption)
	{
	case THISNUMBER:
		nFrom = atoi(m_sThisValue);
		nTo = nFrom;
		break;
		
	case MORETHAN:
		nFrom = atoi(m_sMoreThanValue) + 1;
		nTo = INT_MAX;
		break;
		
	case LESSTHAN:
		nFrom = INT_MIN;
		nTo = atoi(m_sLessThanValue) - 1;
		break;
		
	case BETWEEN:
		nFrom = atoi(m_sStartValue);
		nTo = atoi(m_sEndValue);
		break;
	}

	if (!m_bAllowNegative)
	{
		nFrom = max(nFrom, 0);
		nTo = max(nTo, 0);
	}
}

void CFindNumPage::GetNumberRange(double& dFrom, double& dTo)
{
	if (GetSafeHwnd())
		UpdateData();

	switch (m_nNumberOption)
	{
	case THISNUMBER:
		dFrom = Misc::Atof(m_sThisValue);
		dTo = dFrom;
		break;
		
	case MORETHAN:
		dFrom = Misc::Atof(m_sMoreThanValue) + 0.0000001;
		dTo = DBL_MAX;
		break;
		
	case LESSTHAN:
		dFrom = DBL_MIN;
		dTo = Misc::Atof(m_sMoreThanValue) - 0.0000001;
		break;
		
	case BETWEEN:
		dFrom = Misc::Atof(m_sStartValue);
		dTo = Misc::Atof(m_sEndValue);
		break;
	}

	if (!m_bAllowNegative)
	{
		dFrom = max(dFrom, 0);
		dTo = max(dTo, 0);
	}
}

void CFindNumPage::OnChangeOption() 
{
	UpdateData();
	EnableControls(m_nNumberOption);
}

void CFindNumPage::EnableControls(int nOption)
{
	GetDlgItem(IDC_THISNUMBER)->EnableWindow(nOption == THISNUMBER);
	GetDlgItem(IDC_MORETHANNUMBER)->EnableWindow(nOption == MORETHAN);
	GetDlgItem(IDC_LESSTHANNUMBER)->EnableWindow(nOption == LESSTHAN);
	GetDlgItem(IDC_NUMBERSTART)->EnableWindow(nOption == BETWEEN);
	GetDlgItem(IDC_NUMBEREND)->EnableWindow(nOption == BETWEEN);
}

CString CFindNumPage::GetRegKey() const
{
	CString sKey, sTitle;
	GetWindowText(sTitle);

	if (sTitle.IsEmpty())
		sTitle = m_psp.pszTitle;

	sKey.Format("FindTasks\\%s", sTitle);

	return sKey;
}

void CFindNumPage::OnDestroy() 
{
	CPropertyPage::OnDestroy();

	CString sRegKey = GetRegKey();
	
	AfxGetApp()->WriteProfileInt(sRegKey, "LastNumOption", m_nNumberOption);
	AfxGetApp()->WriteProfileString(sRegKey, "LastThisValue", m_sThisValue);
	AfxGetApp()->WriteProfileString(sRegKey, "LastMoreThanValue", m_sMoreThanValue);
	AfxGetApp()->WriteProfileString(sRegKey, "LastLessThanValue", m_sLessThanValue);
	AfxGetApp()->WriteProfileString(sRegKey, "LastStartValue", m_sStartValue);
	AfxGetApp()->WriteProfileString(sRegKey, "LastEndValue", m_sEndValue);
}

⌨️ 快捷键说明

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