Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)qqpublished 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,rcClientwnd->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为全局变量,其声明如下:
赞