📄 aneasyvaluectrl.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 + -