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

📄 aneasyvaluectrl.cpp

📁 本书分为五个部分
💻 CPP
字号:
// AnEasyValueCtrl.cpp : CAnEasyValueCtrl ActiveX 控件类的实现。

#include "stdafx.h"
#include "S18_01.h"
#include "AnEasyValueCtrl.h"
#include "AnEasyValuePpg.h"
#include "AnEasyValueOtherPropPage.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif


IMPLEMENT_DYNCREATE(CAnEasyValueCtrl, COleControl)



// 消息映射

BEGIN_MESSAGE_MAP(CAnEasyValueCtrl, COleControl)
	ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties)
//	ON_WM_SIZE()
//	ON_WM_SIZING()
//ON_WM_SIZE()
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()



// 调度映射

BEGIN_DISPATCH_MAP(CAnEasyValueCtrl, COleControl)
	DISP_FUNCTION_ID(CAnEasyValueCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
	DISP_STOCKPROP_CAPTION()
	DISP_STOCKPROP_BACKCOLOR()
	DISP_STOCKPROP_FORECOLOR()
	DISP_PROPERTY_NOTIFY_ID(CAnEasyValueCtrl, "TextAlign", dispidTextAlign, m_TextAlign, OnTextAlignChanged, VT_I4)
	DISP_PROPERTY_EX_ID(CAnEasyValueCtrl, "MaxValue", dispidMaxValue, GetMaxValue, SetMaxValue, VT_I4)
	DISP_PROPERTY_EX_ID(CAnEasyValueCtrl, "MinValue", dispidMinValue, GetMinValue, SetMinValue, VT_I4)
	DISP_PROPERTY_EX_ID(CAnEasyValueCtrl, "CurValue", dispidCurValue, GetCurValue, SetCurValue, VT_I4)
	DISP_STOCKFUNC_DOCLICK()
	DISP_FUNCTION_ID(CAnEasyValueCtrl, "ABeep", dispidABeep, Beep, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()



// 事件映射

BEGIN_EVENT_MAP(CAnEasyValueCtrl, COleControl)
	EVENT_STOCK_CLICK()
	EVENT_CUSTOM_ID("ValueIsMax", eventidValueIsMax, ValueIsMax, VTS_PI4)
END_EVENT_MAP()



// 属性页

// TODO: 按需要添加更多属性页。请记住增加计数!
BEGIN_PROPPAGEIDS(CAnEasyValueCtrl, 5)
	PROPPAGEID(CAnEasyValuePropPage::guid)	//默认属性页
	PROPPAGEID( CLSID_CFontPropPage )		//常用属性页(字体)
	PROPPAGEID( CLSID_CColorPropPage )		//常用属性页(颜色)
	PROPPAGEID( CLSID_CPicturePropPage )	//常用属性页(图片)
	PROPPAGEID(CAnEasyValueOtherPropPage::guid)	//自定义属性页
END_PROPPAGEIDS(CAnEasyValueCtrl)



// 初始化类工厂和 guid

IMPLEMENT_OLECREATE_EX(CAnEasyValueCtrl, "S18_01.AnEasyValueCtrl.1",
	0xf4acbf47, 0x54f5, 0x401f, 0xa0, 0x7, 0xc5, 0x9f, 0xb1, 0x7b, 0x49, 0x29)



// 键入库 ID 和版本

IMPLEMENT_OLETYPELIB(CAnEasyValueCtrl, _tlid, _wVerMajor, _wVerMinor)



// 接口 ID

const IID BASED_CODE IID_DS18_01 =
		{ 0xB2CC7821, 0x50B3, 0x4095, { 0xB1, 0xED, 0x11, 0x36, 0x91, 0x2E, 0xFB, 0x6F } };
const IID BASED_CODE IID_DS18_01Events =
		{ 0x2BA2463A, 0xAD1E, 0x4904, { 0x90, 0x46, 0x7A, 0xF5, 0x44, 0xE9, 0x64, 0xAE } };



// 控件类型信息

static const DWORD BASED_CODE _dwS18_01OleMisc =
	OLEMISC_ACTIVATEWHENVISIBLE |
	OLEMISC_SETCLIENTSITEFIRST |
	OLEMISC_INSIDEOUT |
	OLEMISC_CANTLINKINSIDE |
	OLEMISC_RECOMPOSEONRESIZE;

IMPLEMENT_OLECTLTYPE(CAnEasyValueCtrl, IDS_S18_01, _dwS18_01OleMisc)



// CAnEasyValueCtrl::CAnEasyValueCtrlFactory::UpdateRegistry -
// 添加或移除 CAnEasyValueCtrl 的系统注册表项

BOOL CAnEasyValueCtrl::CAnEasyValueCtrlFactory::UpdateRegistry(BOOL bRegister)
{
	// TODO: 验证您的控件是否符合单元模型线程处理规则。
	// 有关更多信息,请参考 MFC 技术说明 64。
	// 如果您的控件不符合单元模型规则,则
	// 必须修改如下代码,将第六个参数从
	// afxRegApartmentThreading 改为 0。

	if (bRegister)
		return AfxOleRegisterControlClass(
			AfxGetInstanceHandle(),
			m_clsid,
			m_lpszProgID,
			IDS_S18_01,
			IDB_S18_01,
			afxRegApartmentThreading,
			_dwS18_01OleMisc,
			_tlid,
			_wVerMajor,
			_wVerMinor);
	else
		return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
}



// CAnEasyValueCtrl::CAnEasyValueCtrl - 构造函数

CAnEasyValueCtrl::CAnEasyValueCtrl()
{
	InitializeIIDs(&IID_DS18_01, &IID_DS18_01Events);
	// TODO: 在此初始化控件的实例数据。
	// 设置控件的初始大小
	SetInitialSize(200,50);
	// 设置属性对象的初始值
	m_MaxValue = 10000;
	m_MinValue = 0;
	m_CurValue = 5000;
	m_TextAlign = 1; // 居中
}



// CAnEasyValueCtrl::~CAnEasyValueCtrl - 析构函数

CAnEasyValueCtrl::~CAnEasyValueCtrl()
{
	// TODO: 在此清理控件的实例数据。
}



// CAnEasyValueCtrl::OnDraw - 绘图函数

void CAnEasyValueCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
	// TODO: 用您自己的绘图代码替换下面的代码。
	pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

	// 设置背景颜色
//	pdc->SetBkMode(TRANSPARENT);
//	CBrush BkBrush(TranslateColor(GetBackColor()));
//	pdc->FillRect(rcBounds, &BkBrush);

	// 显示当前值(数值)
	CString Value;
	Value.Format("%ld",m_CurValue);
	m_szValueText = pdc->GetTextExtent(Value); //取字符串的尺寸
	// 设置显示矩形
	CRect rcDraw = rcBounds;
	rcDraw.top += 5;
	rcDraw.bottom = rcDraw.top + m_szValueText.cy;
	// 设置文本颜色
	//pdc->SetTextColor(TranslateColor(GetForeColor()));
	switch( m_TextAlign ) 
	{
	case 0:	//左对齐
		pdc->DrawText(Value, &rcDraw, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
		break;
	case 2: //右对齐
		pdc->DrawText(Value, &rcDraw, DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
		break;
	default: //居中(==1)
		pdc->DrawText(Value, &rcDraw, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
		break;
	}

	// 显示数据条边框
	// 设置数据条边框矩形
	m_rcBar = rcBounds;
	m_rcBar.DeflateRect(5,5);
	m_rcBar.top += m_szValueText.cy + 1;
	pdc->Rectangle( &m_rcBar );

	// 显示数据条
	// 调整当前值
	if( m_CurValue>m_MaxValue ) m_CurValue = m_MaxValue;
	if( m_CurValue<m_MinValue ) m_CurValue = m_MinValue;

	// 绘制当前位置
	m_rcBar.DeflateRect(1,1);
	rcDraw = m_rcBar;
	double dR = double(rcDraw.Width())/double(m_MaxValue-m_MinValue);
	rcDraw.right = rcDraw.left + int((m_CurValue-m_MinValue)*dR);

	// 显示数据条
	pdc->FillSolidRect( rcDraw, TranslateColor(GetForeColor()) );

}


// CAnEasyValueCtrl::DoPropExchange - 持久性支持

void CAnEasyValueCtrl::DoPropExchange(CPropExchange* pPX)
{
	ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
	COleControl::DoPropExchange(pPX);

	// TODO: 为每个持久的自定义属性调用 PX_ 函数。
//	PX_Long(pPX, _T("CurValue"), m_CurValue, 10000);
}



// CAnEasyValueCtrl::OnResetState - 将控件重置为默认状态

void CAnEasyValueCtrl::OnResetState()
{
	COleControl::OnResetState();  // 重置 DoPropExchange 中找到的默认值

	// TODO: 在此重置任意其他控件状态。
}



// CAnEasyValueCtrl::AboutBox - 向用户显示“关于”框

void CAnEasyValueCtrl::AboutBox()
{
	CDialog dlgAbout(IDD_ABOUTBOX_S18_01);
	dlgAbout.DoModal();
}



// CAnEasyValueCtrl 消息处理程序

void CAnEasyValueCtrl::OnTextAlignChanged(void)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此添加属性处理程序代码
	InvalidateControl(); //强制刷新控件
	SetModifiedFlag();
}

LONG CAnEasyValueCtrl::GetMaxValue(void)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此添加属性处理程序代码
	return m_MaxValue;
}

void CAnEasyValueCtrl::SetMaxValue(LONG newVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此添加属性处理程序代码
	if( newVal>m_MinValue ) //保证最大值不能比最小值小!
		m_MaxValue = newVal;
	if( m_CurValue>m_MaxValue ) //调整当前值
		m_CurValue = m_MaxValue;

	InvalidateControl();
	SetModifiedFlag();
}

LONG CAnEasyValueCtrl::GetMinValue(void)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此添加调度处理程序代码
	return m_MinValue;
}

void CAnEasyValueCtrl::SetMinValue(LONG newVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此添加属性处理程序代码
	if( newVal<m_MaxValue ) //保证最小值不能比最大值大!
		m_MinValue = newVal;
	if( m_CurValue<m_MinValue ) //调整当前值
		m_CurValue = m_MinValue;

	InvalidateControl();
	SetModifiedFlag();
}

LONG CAnEasyValueCtrl::GetCurValue(void)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此添加调度处理程序代码
	return m_CurValue;
}

void CAnEasyValueCtrl::SetCurValue(LONG newVal)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此添加属性处理程序代码
	if( newVal>=m_MinValue && newVal<=m_MaxValue )
		m_CurValue = newVal;
	else if( newVal<m_MinValue )
		m_CurValue = m_MinValue;
	else //if( newVal>m_MaxValue )
		m_CurValue = m_MaxValue;

	// 如果当前值达到最大值,则引发事件ValueIsMax
	if( m_CurValue>=m_MaxValue )
		ValueIsMax(&m_MaxValue);

	InvalidateControl();
	SetModifiedFlag();
}


void CAnEasyValueCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
	// 改变当前的位置
	if( nFlags & MK_LBUTTON ) // 如果同时左键按下
	{
		// 根据鼠标的位置,来设置当前值
		if( point.x<=m_rcBar.left ) //左边
			m_CurValue = m_MinValue;
		else if( point.x>=m_rcBar.right ) //右边
			m_CurValue = m_MaxValue;
		else //if( point.x>m_rcBar.left && point.x<m_rcBar.right )//数据条内
		{
			// 转换成对应的当前值
			double dR = double(m_rcBar.Width())/double(m_MaxValue-m_MinValue);
			m_CurValue = m_MinValue + long((point.x-m_rcBar.left)/dR);
		}

		// 如果当前值达到最大值,则引发ValueIsMax事件
		if( m_CurValue>=m_MaxValue )
			ValueIsMax(&m_MaxValue);

		// 重画控件, 自动调用OnDraw函数
		InvalidateControl();	// 或者调用函数Invalidate();
		SetModifiedFlag();
	}

	COleControl::OnMouseMove(nFlags, point);
}

void CAnEasyValueCtrl::Beep(void)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

	// TODO: 在此添加调度处理程序代码
	MessageBeep((UINT)-1);
}

⌨️ 快捷键说明

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