Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)qq
published in(发表于) 2014/7/9 22:38:44
visual c++中ActiveX控件创建实例

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为全局变量,其声明如下:


If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759