📄 teach_sp_22.htm
字号:
<!-- LANGUAGE='JavaScript'>write_body();<-->
<!-- LANGUAGE='JavaScript'>write_bar();<-->
<table width=98% cellspacing="0" cellpadding="0" align=center><!--整体框架-->
<tr><td>
<table border=0 width="100%" cellspacing="0" cellpadding="2"><!--标记放置区域-->
<tr>
<td width="30%" align="center" bgcolor="#8E8E8E" valign=middle><img src=../../img/brand_200_60.gif width=200 height=60 alt="LOGO1"></td>
<td width="70%" align="center" bgcolor="#8E8E8E" valign=middle><!-- LANGUAGE='JavaScript'>write_ban();<--></td>
</tr>
<tr>
<td colspan="2" bgcolor="#939393" align=center><font color=white>您当前位置</font> <a href=../../index.htm><font color=white>首页</font></a> <a href=../index.htm><font color=white>开发教程</font></a> <a href=index.htm><font color=white><font class=engul>Visual C++/MFC</font>专题讲座</font></a> <font color=white>2.2 利用<font class=eng>MFC</font>开发<font class=eng>ActiveX</font>控件</font> <font color=white><!-- LANGUAGE='JavaScript'>write_command();<--></font></td>
</tr>
</table><!--标记放置区域 END-->
<table border=0 width=100% cellspacing="0" cellpadding="0">
<tr bgcolor="#F4F4F4">
<td><!-- article title begin here-->
<br>
<p align=center><big>2.2 利用<font class=eng>MFC</font>开发<font class=eng>ActiveX</font>控件</big></p>
<table border=0 align=center width=100%>
<tr><td><small>
<!-- article content begin here-->
<p>利用MFC的Application Wizard我们可以方便的创建一个工程,首先在工程类型中选择MFC ActiveX Control,然后选择在工程中创建多少个控件。在接下来的对话框中并且为每个控件输入相关信息,通过Edit Name按钮可以为控件指定名称,通过Advanced按钮可以为控件指定各种附加特性,此外你还可以将控件指定为一个继承了某种现有窗口类的子类。在本节的例子中我们创建三个控件,分别是:
<ul>
<li>普通窗口控件 CSam_windowCtrl</li>
<li>无窗口控件 CSam_nowindowCtrl</li>
<li>EDIT窗口控件 CSam_editwindowCtrl</li>
</ul>
<img src=sp_teach_221.gif>
<br>
<img src=sp_teach_222.gif>
<br>
在工程创建完毕后你就可以编译并测试控件了,但是这时候的控件还不能做任何事情。我们需要为控件添加方法和属性。简单的讲,方法就相当与类中的函数调用,而属性就相当与类中的成员变量。
</p>
<p>假设在普通窗口控件中我们将显示一份学生资料,包括姓名,出生年月,班级名称,为了能够设置这些数据,我们为控件添加一个方法。选择Class Wizard,并选中对话框中的Automation页,按下Add Method按钮以添加消息,然后在弹出的对话框中输入相关信息。我们为新添加的方法取名为SetMertial,同时指定三个参数LPCTSTR pszName,LPCTSTR pszBirth,LPCTSTR pszClass,返回值设置为void,在保存后Class Wizard会生成一个函数,该函数的名称就是你所指定的方法名称。此外我们还添加一个属性用于让用户设置显示文字的颜色。在添加属性对话框中为属性取名为TextColor,并且接收的参数为OLE_COLOR,并且将实现方法设定为Get/Set Methods。在保存后Class Wizard会为你生成GetXXX/SetXXX两个函数XXX就代表你所指定的属性名,当控件容器更改属性时就通过这两个函数。
<br>
<img src=sp_teach_223.gif>
<br>
<img src=sp_teach_224.gif>
<br>
<img src=sp_teach_225.gif>
<br>然后我们为CSam_windowCtrl添加三个成员变量保存这些学生资料和一个用于保存颜色,当然别忘了在构造函数中对它们初始化。然后修改和添加与方法和属性有关的函数,我们可以看到在数据被修改后都会调用Invalidate()使窗口重绘。
<pre>
// 添加成员变量
class CSam_windowCtrl : public COleControl
{
DECLARE_DYNCREATE(CSam_windowCtrl)
// Constructor
public:
CSam_windowCtrl();
CString m_szName,m_szBirth,m_szClass;
...
}
//初始化
CSam_windowCtrl::CSam_windowCtrl()
{
InitializeIIDs(&IID_DSam_window, &IID_DSam_windowEvents);
m_szName="name";
m_szBirth="birth";
m_szClass="class";
...
}
void CSam_windowCtrl::SetMertial(LPCTSTR pszName, LPCTSTR pszBirth, LPCTSTR pszClass)
{
//保存数据
m_szName=pszName;
m_szBirth=pszBirth;
m_szClass=pszClass;
Invalidate();
}
OLE_COLOR CSam_windowCtrl::GetTextColor()
{
//得到属性
return m_ocText;
}
void CSam_windowCtrl::SetTextColor(OLE_COLOR nNewValue)
{
//设置属性
m_ocText=nNewValue;
Invalidate();
SetModifiedFlag();
}
</pre>
最后我们再为控件添加一个事件,在Class Wizard中选择ActiveX Events页面,并添加一个事件。Timer事件,当你需要触发该事件时你可以通过调用FireTimer()来进行。我们在控件中设置一个定时间器每两秒钟触发一次事件
<br>
<img src=sp_teach_225.gif>
<br>
<img src=sp_teach_225.gif>
<br>具体代码如下:<pre>
//在头文件中由Class Wizard生成的事件触发代码
// Event maps
//{{AFX_EVENT(CSam_windowCtrl)
void FireTimer()
{FireEvent(eventidTimer,EVENT_PARAM(VTS_NONE));}
//}}AFX_EVENT
DECLARE_EVENT_MAP()
//创建定时器与触发事件
int CSam_windowCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
SetTimer(1,2000,NULL);
return 0;
}
void CSam_windowCtrl::OnTimer(UINT nIDEvent)
{
FireTimer();
COleControl::OnTimer(nIDEvent);
}</pre>
现在你可以通过VC开发包中的ActiveX Control Test Container对你的控件进行测试了。在插入了控件后可以通过容器来调用控件的方法和设置属性,此外如果打开事件日志窗口(Event Log)就可以看见所有产生的事件列表。
</p>
<p>对于无窗口对话框,我们为它创建一个方法DoCalc,该方法接收两个参数,并返回一个long型数,其作用就是将两个值相加并在消息框中显示。对于无窗口特性的控件加载时间要明显快于有窗口的控件,但是必须要容妻支持这一特性时才会有效,否则控件窗口还是会被产生。
</p>
<p>对于EDIT窗口子类的控件,你可以直接进行测试,你会发现它与普通的EDIT框没有区别。</p>
<p><a href=sam_sp_teach_221.zip>下载本节示范代码 24K</a></p>
<p>此外ActiveX还可以具备其他一些特性,比如说无闪烁特性,当拥有这一特性时窗口在活动与非活动状态间转换时不会收到UI消息。而对于非活动状态鼠标通知特性允许控件在非活动状态时能够接收到鼠标消息。</p>
<!-- article content end-->
<p align=center><a href=index.htm#charpter2>返回</a></p>
</td></tr>
</table>
<p align=center><small>版权所有 闻怡洋 <a href=http://www.vchelp.net/><font class=engul>http://www.vchelp.net/<font></a></small></p>
</td>
</tr><!-- article title end-->
</table>
</td></tr></table><!--整体框架 END-->
<!-- LANGUAGE='JavaScript'>write_tail();<-->
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -