mfc编程 孙鑫_MFC(ActiveX编程,孙鑫C++第十八讲笔记整理)

这篇博客介绍了MFC环境下如何创建和使用ActiveX控件,包括在VB中调用X控件、在VC中创建和测试X控件的过程,涉及到控件的属性、方法、事件的添加以及持久性属性的实现。同时讲解了如何在设计时禁用控件的更新和在对话框中动态插入并响应ActiveX控件的事件。
摘要由CSDN通过智能技术生成

一:在VB中调用X控件,添加方法project->Add components。另外可以用Object Browser来查看控件

二:在VC中创建X控件

1.新建一个X工程名为Clock,注意一个文件中可以包含多个控件。

2.保持缺省设置,完成。注意它生成的三个类,以及相关的接口。

3.运行它。选择TSTCON32.exe作为容器。

4.选择Insert Control,此时我们可以看到,它画了一个椭圆。也可以在VB中测试。

5.删除注册信息。用regsvr32 /u +文件名。也可以在菜单选择反注册命令。

6.重写代码。在CClockCtrl::OnDraw()中画了一个椭圆,此时我们在其中得到系统时间,并显示它。为此我们在OnCreate()设置了一个定时器,每隔一定时间发出一个Invalidate()消息,使窗口重绘。

7.如何改变控件的背景色和前景色?ClassWizard->AutoMation->Add Property->BackColor,还需要在OnDraw()中加上相应的代码

CBrush brush(TranslateColor(GetBackColor()));

pdc->FillRect(rcBounds, &brush);

pdc->SetBkMode(TRANSPARENT);

pdc->SetTextColor(TranslateColor(GetForeColor()));

8.增加属性页。在

BEGIN_PROPPAGEIDS(CClockCtrl, 2)此时数目也得改成相应的数目

PROPPAGEID(CClockPropPage::guid)

PROPPAGEID(CLSID_CColorPropPage)

END_PROPPAGEIDS(CClockCtrl)  OK~

9.增加自定义属性:ClassWizard->AutoMation->Add Property加上一个变量m_interval,类型为short,对应外部变量为Interval。在CClockCtrl中增加OnIntervalChanged方法。添加如下代码:

if(m_interval<0 || m_interval>6000)

{

m_interval=1000;

}

else

{

m_interval=m_interval/1000*1000;

KillTimer(1);

SetTimer(1,m_interval,NULL);

BoundPropertyChanged(0x1);

}

10.测试:Control->Invoke Methods

11.将时间间隔加到属性页中,在资源视图中加入一文本框和编辑框。为EditBox关联成员变量,加入属性interval。

12.增加方法:ClassWizard->AutoMation->Add Method->Hello加入代码OK!在VB中可以调用此方法!

void CClockCtrl::Hello()

{

// TOD Add your dispatch handler code here

MessageBox("Hello world!");

}

13.增加事件:ClassWizard->AutoMation->Add Events->Click

14.增加自定义事件:ClassWizard->AutoMation->Add Events->NewMinute

在新的一分钟到达时发出这个通知,在OnDraw()中写代码:

CTime time=CTime::GetCurrentTime();

if(0==time.GetSecond())

{

FireNewMinute();

}

15.让Interval属性具有持久性。在CClockCtrl::DoPropExchange()中调用PX_short()方法,OK!

PX_Short(pPX,"Interval",m_interval,1000);

16.让Property Page和Property属性中的interval保持一致的方法:在OnIntervalChanged()中调用BoundPropertyChanged(0x1);

17.希望控件在设计时间内不走动的方法:在OnTimer()中,if(AmbientUserMode())InvalidateControl();巧妙!

三:在VC中调用X控件

1.新建ClockTest对话框应用程序

2.点击右键->插入X控件->时钟控件

3.Project->Add Component会生成CClock类。

4.在CCLockTestDlg中增加CClock类的成员变量m_clock,然后可以动态创建一个这样的东东!

5.试验Click(),NewMinute(),SetBkColor(),SetForeColor()方法和属性

6.如何为动态创建的控件做事件响应呢?首先你得知道它的ID号,然后参考非动态的控件事件代码。

下面是具体的代码:

1创建一个MFC ActiveX ControWizard项目,什么都不用做,直接运行,就能有一个Activex控件了,其作用是生成一个椭圆

运行,直接注册到了系统,所以在别的地方能够找到生成的ActiveX控件

这里在VS2008中的VB来测试。

右键---->选择项---->

58f2f09bf47895e321f5cfda91db753f.png

此时工具箱就多了一个控件

2ef79548166ac7f09b78e9ef4d526ebf.png

拖动到窗口,效果如下:

11b88fb7858b5c422b36f1b0654722c5.png

项目文件Debug中含有:

ef0edb7312755d5ec3d15da30450c8ea.png

在运行 输入

84bcd31462f1bea6af1dd292d7842010.png

然后把上面的ocx文件拖进去,按确定,反编译,使得从注册表中移除

14e35e51c00c6e24d5858a989e8f4c4d.png

然后运行MFCXXX,找不到ActiveX找不到控件

da176e335444f8b912293e38bb643850.png

使用Tools下的Register Contrl可以注册ActiveX

或者运行 regsvr32  再把ocx文件拖进来 就可以注册了,跟上面一样,只是去掉了/u

fb3d911d7cae24bb5c86e82e670dcfa4.png

下面开始做自己的|ActiveX了

voidCATestCtrl::OnDraw(

CDC* pdc, constCRect& rcBounds,constCRect& rcInvalid)

{

// TODO: Replace the following code with your own drawing code.

//pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

//pdc->Ellipse(rcBounds);

//上面两句是默认的,画椭圆

CTime c=CTime::GetCurrentTime();

CString cstring=c.Format("%H:%M:%S");

pdc->TextOut(0,0,cstring);

}

一个静止的时间,要想它动态的显示,还得加上SetTimer函数和wm_timer

在CXXctrl中添加一个WM_CREATE然后里面Settimer

SetTimer(1,1000,NULL);

添加wm_timer

voidCATestCtrl::OnTimer(UINTnIDEvent)

{

// TODO: Add your message handler code here and/or call default

//Invalidate();

InvalidateControl();

COleControl::OnTimer(nIDEvent);

}

这个时候就能显示一个动态显示的时钟了

在VB中使用刚刚新建的ActiveX,发现只有很少的属性

f7c055061942bf612acada05eec862a1.png

这个时候  我们可以添加自己的属性:

f27bff412fd04803f1c2eea21db1c067.png

这个时候,VS中VB可以显示响应的属性了

95b0ff66cf08b2127de87614f2ae03d3.png

此时在OnDraw中 要相应的添加代码,要不然,设置了背景色和前景色都不起作用

CBrush cbrush(TranslateColor(GetBackColor()));

pdc->FillRect(rcBounds,&cbrush);

pdc->SetBkMode(TRANSPARENT);

pdc->SetTextColor(TranslateColor(GetForeColor()));

voidCATestCtrl::OnDraw(

CDC* pdc, constCRect& rcBounds,constCRect& rcInvalid)

{

// TODO: Replace the following code with your own drawing code.

//pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));

//pdc->Ellipse(rcBounds);

//上面两句是默认的,画椭圆

CBrush cbrush(TranslateColor(GetBackColor()));

pdc->FillRect(rcBounds,&cbrush);

pdc->SetBkMode(TRANSPARENT);

pdc->SetTextColor(TranslateColor(GetForeColor()));

CTime c=CTime::GetCurrentTime();

CString cstring=c.Format("%H:%M:%S");

pdc->TextOut(0,0,cstring);

}

手动添加属性页

BEGIN_PROPPAGEIDS(CATestCtrl, 2)

PROPPAGEID(CATestPropPage::guid)

PROPPAGEID(CLSID_CColorPropPage)

END_PROPPAGEIDS(CATestCtrl)

a1d971b545d15854bc012e9b174e8aa4.png

添加自定义属性:

be7ad298902e945666262016853974bc.png

voidCATestCtrl::OnJianGeChanged()

{

// TODO: Add notification handler code

if(m_jianGe<0||m_jianGe>6000)

{

m_jianGe=1000;

}

else

{

m_jianGe=m_jianGe/1000*1000;

KillTimer(1);

SetTimer(1,m_jianGe,NULL);

}

SetModifiedFlag();

}

194704a5bb0de8f2d0d83d78488a2644.png

属性面板的 有的能看间JianGe有的不能看到

将这个添加到属性页去

e957ccf449dccb6e973adf16d4ac3cd0.png

添加关联

daeaa7438a99176c891daf291696e4b4.png

最后一项是属性名

d7e13cec4fc547092a98ef94baaf9d90.png

可以为ActiveX添加(标准的和自定义的)事件和函数。

MFC中添加该类

5ddde47bc28bb6ca25796347ed3cd4b0.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值