visual c++中ActiveX控件创建实例
ActiveX控件创建实例
为了巩固上节所学的内容,在本节中,将讲述ActiveX控件ExEdit的制作过程。ExEdit是一个简单具有阴影和回车更换Tab顺序功能的文本框,本书由于篇幅有限,仅添加了一个设置阴影颜色的Shadow属性和文本框的更改事件OnChange。下面介绍其步骤。
(1)首先,利用App Wizard建立一个基于MFC ActiveX Control Wizard的工程,在Preject name文本框中输入要建立工程的名称“ExEdit”,如图1所示。

图1 建立一个基于MFC ActiveX Control Wizard的应用程序
(2)单击“OK”按钮,进入“MFC ActiveX ControlWizard -step1 of 2”对话框,在此对话框中,读者不需要更改任何设置,单击【Next】按钮,进入“MFC ActiveX ControlWizard- step 2 of 2”对话框。
(3)在“MFC ActiveX ControlWizard-step 2 of 2”对话框中,将“Has an'About'Box”复选框的对号去掉,单击“Finish”按钮,工程建立完成。
(4)在介绍代码编写之前,还是先分析一下控件的功能。
具有文本框的编辑功能。
具有阴影。
具有设置阴影颜色的属性Shadow。
具有文本框的更改事件OnChange。
具有回车将焦点移动到下一个控件的功能。
(5)前面已经讲过,代表控件本身的类是COleControl的派生类,在本例中,是CExEditCtrl类,所以多数操作都是在这个类中完成的。读者可以将控件当成一个容器,可以在其中添加任何通用控件。
(6)首先,为项目添加一个全局变量CEdit m_Edit,这个对象代表了文本框。
(7)在CExEditCtrl的OnCreate中对创建m_Edit对象,并进行初始化。
为了巩固上节所学的内容,在本节中,将讲述ActiveX控件ExEdit的制作过程。ExEdit是一个简单具有阴影和功能的文本框,本书由于篇幅有限,仅添加了一个设置阴影颜色的Shadow属性和文本框的更改事件OnChange。下面介绍其步骤。
(1)首先,利用App Wizard建立一个基于MFC ActiveX Control Wizard的工程,在Preject name文本框中输入要建立工程的名称“ExEdit”,如图1所示。
程序代码如下。
int CExEditCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
……
CRect rect(1,1,100,24); //随便建立一个矩形
m_Edit.Create(WS_CHILD,rect,this,WM_USER+9999); //建立对象
m_Edit.ShowWindow(SW_SHOW); //显示
//调整客户区大小
CWnd* wnd=m_Edit.GetParent(); //找到控件
CRect rcBounds,rcClient
wnd->GetClientRect(&rcBounds);
rcClient.left=rcBounds.left+1; //留出边线区域或阴影区域
rcClient.top=rcBounds.top+1;
rcClient.right=rcBounds.right-4;
rcClient.bottom=rcBounds.bottom-4;
m_Edit.MoveWindow(&rcClient); //调整大小
……
}
m_Edit建立完成后就可以绘制控件窗口了。
void CExEditCtrl::OnDraw(
CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
CRect rcFrame,rcShadow ;
//绘制阴影
rcShadow.top=rcBounds.top+4;
rcShadow.left=rcBounds.left+4;
rcShadow.bottom=rcBounds.bottom;
rcShadow.right=rcBounds.right;
CBrush brush;
brush.CreateSolidBrush(TranslateColor(Shadow,NULL));
pdc->FillRect(&rcShadow,&brush);
brush.DeleteObject();
//绘制边线
rcFrame.left=rcBounds.left;
rcFrame.top=rcBounds.top;
rcFrame.right=rcBounds.right-3;
rcFrame.bottom=rcBounds.bottom-3;
brush.CreateSolidBrush(RGB(255,255,255));
pdc->FillRect(&rcFrame,&brush);
brush.DeleteObject();
pdc->Draw3dRect(&rcFrame,RGB(0,0,0),RGB(0,0,0));
}
当用户按下回车时,将焦点移动到下一个控件上。
BOOL CExEditCtrl::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->hwnd==m_Edit.GetSafeHwnd() && pMsg->message==WM_KEYDOWN && pMsg-> wParam ==13)
pMsg->wParam=9; //回车更换Tab顺序
return COleControl::PreTranslateMessage(pMsg);
}
现在,控件的基本功能完成了。现在的控件是可以运行的,只是还没有控件的接口。
(8)为控件添加属性
OLE_COLOR CExEditCtrl::GetShadow()
{
return Shadow;
}
void CExEditCtrl::SetShadow(OLE_COLOR nNewValue)
{
Shadow=nNewValue;
SetModifiedFlag();
}
代码中Shadow为全局变量,其声明如下: