ActiveX控件中使用动态ICON图标
最近接触到了A c tiveX控件的开发,用来做工控上位机中的指示灯和数据显示功能,刚刚接触确实是一头雾水,接下来说一下控件要实现的功能:
1、控件和普通按钮控件一样具有Click功能,用来做开关;
2、ActiveX控件当点击时可以用图标来指示开关状态;
3、空件上有动态图标用来表示设备运行的不同状态;
4、数据显示,显示设备相关的参数。
1、实现的过程:
ActiveX控件控件的外观样式是通过
void xxxx::OnDraw(CDC* pdc, const CRect& rcBound s, const CRect& rcInval id) {
……
}
函数实现,大部分工作都是在这里面进行绘制,当然会涉及到很多GDI函数。初始化函数
xxx::CWidget Ctrl()
{
…………
}
需要早初始化函数里面设置一些数据的初始值,控件的大小
SetInit ialSiz e(100,45); //设置控件初始尺寸大小
接下来是为控件添加自定义的事件和方法,这个也很简单,在控件设计前先要把需要的I CON图标素材准备好。
设计好的控件的样式如图
把控件放在测试窗口OcxT est
2、实现控件的源代码:
// WidgetC trl.cpp : CWidget Ctrl ActiveX控件类的实现。
#include"stdafx.h"
#include"Widget.h"
#include"WidgetC trl.h"
#include"WidgetP ropPag e.h"
#ifdef _DEBUG
#definenew DEBUG_N EW
#endif
HICON hIcon[6];//图标句柄
int act_Lam ps; //实际灯的数量
int act_Pow er; //实际总功率
int act_Rat Power;//单灯额定功率
CString act_Lig htOn;//开灯时间
int pmin,pmax;//最小最大额定功率值
CString CWidget;//需要显示的功率
int lamps; //实际在线数量
CString systime1;//系统时间
CString systime2;//系统时间
CTimeSp an timespa n;//时间差
CTime t1,t2;
BOOL chanel;//开关标志
CString state;
BOOL chtime;
IMPLEME NT_DYN CREATE(CWidget Ctrl, COleCon trol)
// 消息映射
activex 控件BEGIN_M ESSAGE_MAP(CWidget Ctrl, COleCon trol)
ON_OLEV ERB(AFX_IDS_VERB_PROPER TIES, OnPrope rties) ON_WM_M OUSEMO VE()
ON_WM_S ETCURS OR()
ON_WM_T IMER()
END_MES SAGE_M AP()
// 调度映射
BEGIN_D ISPATC H_MAP(CWidget Ctrl, COleCon trol)
DISP_FU NCTION_ID(CWidget Ctrl, "AboutBo x", DISPID_ABOUTB OX, AboutBo x, VT_EMPT Y, VTS_NON E)
DISP_FU NCTION_ID(CWidget Ctrl, "SetWidg et", dispidS etWidg et, SetWidg et, VT_EMPT Y, VTS_BST R)
DISP_FU NCTION_ID(CWidget Ctrl, "SetLamp s", dispidS etLamp s, SetLamp s, VT_EMPT Y, VTS_BST R)
DISP_FU NCTION_ID(CWidget Ctrl, "SetRetW idget", dispidS etRetW idget,SetRetW idget, VT_EMPT Y, VTS_BST R)
DISP_FU NCTION_ID(CWidget Ctrl, "GetSwit ch", dispidG etSwit ch, GetSwit ch, VT_BSTR, VTS_NON E)
END_DIS PATCH_MAP()
// 事件映射
BEGIN_E VENT_M AP(CWidget Ctrl, COleCon trol)
EVENT_S TOCK_C LICK()
END_EVE NT_MAP()
// 属性页
// TODO: 按需要添加更多属性页。请记住增加计数!
BEGIN_P ROPPAG EIDS(CWidget Ctrl, 1)
PROPPAG EID(CWidget PropPa ge::guid)
END_PRO PPAGEI DS(CWidget Ctrl)
// 初始化类工厂和guid
IMPLEME NT_OLE CREATE_EX(CWidget Ctrl, "WIDGET.WidgetC trl.1",
0x2b526949, 0xf154,0x4e9e, 0xb6, 0x40, 0x89, 0xfa, 0x75, 0x79, 0xdd, 0xc8)
// 键入库ID 和版本
IMPLEME NT_OLE TYPELI B(CWidget Ctrl, _tlid, _wVerMa jor, _wVerMi nor)
// 接口ID
const IID BASED_C ODE IID_DWi dget =
{ 0xEFA2A FC0, 0x969F, 0x4894, { 0x88, 0x4D, 0xE3, 0x68, 0xF, 0xB, 0xDA, 0xC4 } }; const IID BASED_C ODE IID_DWi dgetEv ents =
{ 0xF419D8, 0x4BD9, 0x4771, { 0x8B, 0x3F, 0x5D, 0xCE, 0xEA, 0x21, 0x68, 0x25 } };
// 控件类型信息
staticconst DWORD BASED_C ODE _dwWidg etOleM isc =
OLEMISC_ACTIV ATEWHE NVISIB LE |
OLEMISC_SETCL IENTSI TEFIRS T |
OLEMISC_INSID EOUT |
OLEMISC_CANTL INKINS IDE |
OLEMISC_RECOM POSEON RESIZE;
IMPLEME NT_OLE CTLTYP E(CWidget Ctrl, IDS_WID GET, _dwWidg etOleM isc)
// CWidget Ctrl::CWidget CtrlFa ctory::UpdateR egistr y -
// 添加或移除CW idgetC trl 的系统注册表项
BOOL CWidget Ctrl::CWidget CtrlFa ctory::UpdateR egistr y(BOOL bRegist er)
{
// TODO: 验证您的控件是否符合单元模型线程处理规则。
/
/ 有关更多信息,请参考MFC技术说明64。
// 如果您的控件不符合单元模型规则,则
// 必须修改如下代码,将第六个参数从
// afxRegA partme ntThre ading改为0。
if (bRegist er)
returnAfxOleR egiste rContr olClas s(
AfxGetI nstanc eHandl e(),
m_clsid,
m_lpszP rogID,
IDS_WID GET,
IDB_WID GET,
afxRegA partme ntThre ading,
_dwWidg etOleM isc,
_tlid,
_wVerMa jor,
_wVerMi nor);
else
returnAfxOleU nregis terCla ss(m_clsid, m_lpszP rogID); }
// CWidget Ctrl::CWidget Ctrl - 构造函数
CWidget Ctrl::CWidget Ctrl()
{
Initial izeIID s(&IID_DWi dget, &IID_DWi dgetEv ents);
/
/ TODO: 在此初始化控件的实例数据。
/* hIcon[0]=AfxGetA pp()->LoadIco nW(IDI_ICO N4);//灯亮hIcon[1]=AfxGetA pp()->LoadIco nW(IDI_ICO N2);//警告
hIcon[2]=AfxGetA pp()->LoadIco nW(IDI_ICO N1);//熄灭
hIcon[3]=AfxGetA pp()->LoadIco nW(IDI_ICO N3);//禁用
hIcon[4]=AfxGetA pp()->LoadIco nW(IDI_ICO N5);//开灯
hIcon[5]=AfxGetA pp()->LoadIco nW(IDI_ICO N6);//关灯
hIcon[6]=AfxGetA pp()->LoadIco nW(IDI_ICO N7);//空白
*/
SetInit ialSiz e(100,45); //设置控件初始尺寸大小
act_Lam ps=0;
act_Lig htOn="00:00";
act_Pow er=0;
act_Rat Power=0;
lamps=0;
systime1="00:00";
chanel=FA LSE;
chtime=FA LSE;
SetTime r(1,1000,0);
}
// CWidget Ctrl::~CWidget Ctrl - 析构函数
CWidget Ctrl::~CWidget Ctrl()
{
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论