首页 > MFC(ActiveX编程,孙鑫C++第十八讲笔记整理)

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

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一: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 PageProperty属性中的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来测试。

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

 

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

拖动到窗口,效果如下:

项目文件Debug中含有:

 

在运行 输入

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

 

 

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

 

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

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

 

下面开始做自己的|ActiveX了

[cpp] view plaincopy

  1. void CATestCtrl::OnDraw(  

  2.             CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)  

  3. {  

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

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

  6.     //pdc->Ellipse(rcBounds);  

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

  8.     CTime c=CTime::GetCurrentTime();  

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

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

  11. }  



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

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

SetTimer(1,1000,NULL);

添加wm_timer

[cpp] view plaincopy

  1. void CATestCtrl::OnTimer(UINT nIDEvent)   

  2. {  

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

  4.       

  5.     //Invalidate();  

  6.     InvalidateControl();  

  7.     COleControl::OnTimer(nIDEvent);  

  8. }  



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

 

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

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

 

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

 

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

[cpp] view plaincopy

  1. CBrush cbrush(TranslateColor(GetBackColor()));  

  2.     pdc->FillRect(rcBounds,&cbrush);  

  3.     pdc->SetBkMode(TRANSPARENT);  

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



 

[cpp] view plaincopy

  1. void CATestCtrl::OnDraw(  

  2.             CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)  

  3. {  

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

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

  6.     //pdc->Ellipse(rcBounds);  

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

  8.   

  9.   

  10.     CBrush cbrush(TranslateColor(GetBackColor()));  

  11.     pdc->FillRect(rcBounds,&cbrush);  

  12.     pdc->SetBkMode(TRANSPARENT);  

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

  14.   

  15.     CTime c=CTime::GetCurrentTime();  

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

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

  18. }  



手动添加属性页

[cpp] view plaincopy

  1. BEGIN_PROPPAGEIDS(CATestCtrl, 2)  

  2.     PROPPAGEID(CATestPropPage::guid)  

  3.     PROPPAGEID(CLSID_CColorPropPage)  

  4. END_PROPPAGEIDS(CATestCtrl)  



 

 

添加自定义属性:

 

[cpp] view plaincopy

  1. void CATestCtrl::OnJianGeChanged()   

  2. {  

  3.     // TODO: Add notification handler code  

  4.   

  5.     if(m_jianGe<0||m_jianGe>6000)  

  6.     {  

  7.         m_jianGe=1000;  

  8.     }  

  9.     else  

  10.     {  

  11.         m_jianGe=m_jianGe/1000*1000;  

  12.         KillTimer(1);  

  13.         SetTimer(1,m_jianGe,NULL);  

  14.     }  

  15.     SetModifiedFlag();  

  16. }  



 

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

将这个添加到属性页去

添加关联

 

最后一项是属性名

 

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

 

 MFC中添加该类



转载于:https://my.oschina.net/u/1469992/blog/227506

更多相关:

  • 不BB写在自己博客园看的舒服     RelativeLayout布局 android:layout_marginTop="25dip" //顶部距离 android:gravity="left" //空间布局位置 android:layout_marginLeft="15dip //距离左边距 // 相对于给定ID控件 andro...

  • top.geometry()设定窗口的初始大小 scale.set()设定滑块的初始值 scale.get()获取滑块变化的值 控件通过回调函数与其他控件进行通信(Label控件中的文本会受到Scale控件上操作的影响) 转载于:https://www.cnblogs.com/TmHm/p/9949947.html...

  • 在一些控件里的keydown方法,没有办法捕获所有的按键消息 比如自己写一个窗体控件库,继承了UserControl 但是没有办法捕获一些键,比如方向键等 所以必须重载 processDialogkey 方法 processDialogkey 的描述 在msdn中是这样的   在消息预处理过程中调用此方法,以处理对话框字符,比如 Ta...

  • 六 PetShop之表示层设计 表示层(Presentation Layer)的设计可以给系统客户最直接的体验和最十足的信心。正如人与人的相交相识一样,初次见面的感觉总是永难忘怀的。一件交付给客户使用的产品,如果在用户界面(User Interface,UI)上缺乏吸引人的特色,界面不友好,操作不够体贴,即使这件产品性能非常优异,架...

  • ASP.NET页生命周期的定义,有以下8个方面:页请求,开始,页初始化,页加载,验证,回发事件,呈现,卸载。 ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤。这些步骤包括初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行呈现。了解页的生命周期非常重要,这样就能在合适的生命周期阶段编写代...

  • 文档树Document Object Model (DOM) 为文档对象模型, 它使用对象的表示方式来表示对应的文档结构及其中的内容。下面为一个样例 p 元素在文档中的对象所包含的所有属性。控制台:p#domaccessKey: ""align: ""assignedSlot: nullattributeStyleMap: Style...

  • 1、封装 什么是封装?   1.对外部隐藏内部的属性,以及实现细节,给外部提供使用的接口     注意:封装有隐藏的意思,但不是单纯的隐藏     学习封装的目的:就是为了能够限制外界对内部数据的访问   python中属性的权限分为两种:   1.公开的     没有任何限制,谁都可以访问   2.私有的     只有当前类本身能狗...

  • jquery:js框架; 主要区别在dom的操作 jq需要引入文件并且引入顺序在最上面; 找元素 操作元素 js:doucument.getElementById..classname,tagname,name jq:$(选择器) dom是js对象 jqDom是jquery对象 操作内容 js:dom.innerHTML(非表单元素)...

  • Mock.js 的语法规范包括两部分: 数据模板定义规范(Data Template Definition,DTD)数据占位符定义规范(Data Placeholder Definition,DPD)1.数据模板定义规范 DTD 数据模板中的每个属性由 3 部分构成:属性名、生成规则、属性值: // 属性名 name // 生...

  • vue   vue.js 是用于构建交互式的 Web 界面的库。它提供了 MVVM 数据绑定和一个可组合的组件系统,具有简单、灵活的 API。从技术上讲, Vue.js 集中在 MVVM 模式上的视图模型层,并通过双向数据绑定连接视图和模型。实际的 DOM 操作和输出格式被抽象出来成指令和过滤器。相比其它的 MVVM 框架,Vue.j...