mfc自定义控件开发,mfc常用控件

  mfc自定义控件开发,mfc常用控件

  ActiveX是基于组件对象模型(COM)的可重用软件组件,广泛应用于桌面和Web应用程序。VC下ActiveX控件的开发可以分为三种类型。一种是直接用COM API开发ActiveX控件,显然很麻烦,对程序员要求也很高,一般不考虑。一种是基于传统的MFC,以面向对象的方式将COM的基本功能封装在多个MFC C类中,开发者通过继承这些类来获得COM支持功能。MFC对于广大VC程序员来说比较熟悉,也比较好学,但是缺点是MFC封装的东西比较多,所以MFC开发的控件会比较大,所以比较适合开发桌面ActivexX控件,尤其是有GUI界面的。第三个是基于ATL的。ATL可以说是专门针对COM开发的一套框架。它使用了C的模板技术,运行时不需要依赖类似MFC程序的庞大代码模块,因此更适合Web应用开发。

  本文介绍的是第二种方式,即利用MFC开发桌面可视化控件的方法和步骤,开发环境基于VC2005。

  1.创建一个控制项目

  打开VC2005后,首先要创建一个项目,在新建项目页面左侧选择Visual C -MFC,右侧选择MFC ActiveX控件,填写解决方案和项目名称。例如,在这里,我的项目名是activexdemo1,解决方案名是activexdemo。

  然后进入控制向导页面。在向导的第二页上,有一个运行时许可证。如果选择此项,将在生成控件的同时生成许可证文件。其他用户在使用此控件时必须附加此许可证。这里,我们将保持默认状态,不选择它。

  下一页是关于项目各部分的命名,可以根据需要定制。默认情况下,此处不会修改。

  下一页是根据哪个控件和控件的一些基本特性来选择控件的扩展。如果新创建的控件基于特定的控件,请选择要在创建的控件下继承的控件名称,否则,将其保留为无。下面的附加功能可以根据实际需要选择,可以将鼠标放在选项上,功能的描述会自动显示在动态出现的小提示窗口中。单击Finish,向导将根据您的选择生成一个新项目。

  进入开发环境,可以先看看类视图。

  其中Cactivexdemo1App是我们控件的主程序模块,它定义了控件的注册(DllRegisterServer)、删除(DllUnregisterServer)等功能。一般不需要移动。如果需要,我们可以在InitInstance和ExitInstance中定义自己的初始化和终止操作代码,一般是一些资源的初始化和销毁。

  Caxtivexdemo1Ctrl是一个控件类,我们要做的控件功能基本上就是要在这个类中实现。

  应该提到的是,父类的OnDraw函数在这个类中被重写,代码如下:

  pdc- FillRect(rcBounds,CB rush:from handle((HBRUSH)GetStockObject(WHITE _ BRUSH)));

  pdc-椭圆(RC bounds);

  也就是说,在控件上绘制一个椭圆。在实际的控件开发中,可以根据功能需求修改和重写该函数来绘制控制界面。

  Caxtivexdemo1PropPage是一个属性页类,它实现了一个对话框,用于在开发过程中设置控件属性。

  Activexdemo1Lib是一个库节点,为客户端提供该控件的属性、方法和可能事件的接口,在添加控件的这些功能时会用到。

  其中Cactivexdemo1App是我们控件的主程序模块,它定义了控件的注册(DllRegisterServer)、删除(DllUnregisterServer)等功能。一般不需要移动。如果需要,我们可以在InitInstance和ExitInstance中定义自己的初始化和终止操作代码,一般是一些资源的初始化和销毁。

  Caxtivexdemo1Ctrl是一个控件类,我们要做的控件功能基本上就是要在这个类中实现。

  应该提到的是,父类的OnDraw函数在这个类中被重写,代码如下:

  pdc- FillRect(rcBounds,CB rush:from handle((HBRUSH)GetStockObject(WHITE _ BRUSH)));

  pdc-椭圆(RC bounds);

  也就是说,在控件上绘制一个椭圆。在实际的控件开发中,可以根据功能需求修改和重写该函数来绘制控制界面。

  Caxtivexdemo1PropPage是一个属性页类,它实现了一个对话框,用于在开发过程中设置控件属性。

  Activexdemo1Lib是一个库节点,为客户端提供这个控件的属性、方法和可能事件的接口,在添加控件的这些功能时会用到。

  设置项目属性会将配置类型设置为静态库(。lib)。

  2.生成并测试控件。

  好了,现在我们可以先生成这个项目了。当然,到现在为止,我们只是系统自动生成的一个控制项目。它没有任何功能,只是一个空框架。

  几秒钟后,项目应该会成功生成。控件也会自动在系统中注册。我如何测试这个控件?当然,你可以新建一个项目,比如一个对话框程序,在对话框资源编辑窗口右侧的工具箱中点击鼠标右键菜单。

  在弹出窗口中找到我们刚刚从COM组件生成的控件,并检查它。

  然后该控件将出现在工具箱中。

  然后用鼠标拖动到对话框中使用该控件。

  除了这种方法,VS还提供了一个简单的控制测试工具。VisualStudio中菜单下的“工具”下有一个ActiveX控件测试容器。

  点按工具栏中的“新控制”按钮。

  在“插入控件”对话框中找到并选择我们的控件。

  然后,您可以在该容器中测试控件的各种功能。

  3.事件

  ActiveX控件使用事件来通知容器控件发生了一些事情。事件的常见示例包括单击控件、使用键盘输入数据以及更改控件的状态。当这些操作发生时,控件将引发一个事件来警告容器。

  MFC支持两种事件:公共事件和自定义事件。公共事件是由COleControl类自动处理的事件。自定义事件使控件能够在控件的特定操作发生时通知容器。控件的内部状态发生变化或收到窗口消息就是这样的事件。

  常见事件

  常见事件由COleControl类自动引发。COleControl包含预定义的成员函数,这些函数引发由常见操作引起的事件。COleControl实现的一些常见操作包括单击和双击控件、键盘事件和鼠标按钮状态更改。

  添加通用事件的操作是在类视图中右键单击ActiveX控件类,比如本例中为Caxtivexdemo1Ctrl。从菜单中选择添加事件,打开添加事件向导。

  在添加事件向导的事件名称中选择Click,即鼠标单击事件,将其添加到控件中。然后,在类视图中选择库节点下的第三个节点,即Dactivexdemo1Events。您可以在下面看到我们刚刚添加的活动。

  然后生成新的控制程序。让我们看看并测试这个新项目。

  打开上面提到的ActiveX控件测试容器,添加这个控件,用鼠标点击控件,就会在程序底部的消息栏看到消息activexdemo1 Control: Click。这是我们添加的鼠标的对应事件。

  在开发环境中使用控件是什么样子的?好,如上所述创建一个新的对话框项目,并在对话框上放置控件。选择这个控件,在属性窗口的控件事件中就会有这个Click事件。如果在使用控件时需要相应的鼠标点击事件,单击ClickActivexdemo1ctrl1在事件响应函数中添加您需要的函数。

  像这样:

  void CtestMFCDlg:clickactivexdemo 1 ctrl 1()

  {

  //TODO:在此添加消息处理程序代码

  MessageBox(_T("Hi。"));

  }

  编译这个测试程序,点击控件位置和消息框。会弹出来。

  自定义事件

  自定义事件和常见事件的区别在于,自定义事件不是由COleControl类自动引发的。自定义事件将控件开发人员确定的操作标识为事件。

  添加通用事件的操作是在类视图中右键单击ActiveX控件类,比如本例中为Caxtivexdemo1Ctrl。从菜单中选择添加事件,打开添加事件向导。定义一个名为MyEvent的事件,它可以接受参数。例如,让我们添加BSTR的参数msg。

  然后,回到类视图。这一次,选择库节点下的第三个节点,即_Dactivexdemo1Events,您将看到下面新添加的事件。

  在类视图中选择控件类,即Cactivexdemo1Ctrl,下面也会出现一个MyEvent函数。

  双击这个MyEvent可以看到如下定义代码:

  无效事件(BSTR消息)

  {

  FireEvent(eventidMyEvent,EVENT_PARAM(VTS_PI1),msg);

  }

  这里的MyEvent (bstrmg)函数用于触发MyEvent。这是什么意思?也就是说,当控件中需要启动自定义myEvent时,调用这个myEvent (bstrmg)就足够了。让我们看看下面的例子。

  例如,我们希望这个事件在用户双击鼠标左键时被触发,我们就这么做吧。在类视图中选择控件类,即Cactivexdemo1Ctrl,然后在消息窗口中找到WM_LBUTTONDBCLK,添加此消息的处理函数。

  按如下方式修改消息处理功能:

  void cactive xdemo 1 ctrl:OnLButtonDblClk(UINT nFlags,CPoint point)

  {

  //TODO:在此添加消息处理程序代码和/或调用默认值

  MyEvent(_T("嗨,MyEvent。"));

  cole control:OnLButtonDblClk(nFlags,point);

  }

  这样,我们的自定义MyEvent事件将在每次用户双击控件时被触发。

  然后看一下测试结果。

  打开ActiveX控件测试容器,添加该控件,然后双击该控件以查看消息框中显示的内容。

  既然双击是自然的,也就是双击,那么就会同时发生两个事件。

  activexdemo1控件:MyEvent {msg=72}

  activexdemo1控件:单击

  打开测试项目,控件的控件事件中会有一个MyEvent事件。

  为此事件添加一个处理函数myeventactivitexdemo 1 ctrl 1(lpctstrmsg)。msg是我们定义事件时的msg参数。在上面的定义中,我们传递了一个“嗨,MyEvent。”字符串消息。看看现在是不是这样。在MyEventActivexdemo1ctrl1函数中,我们显示一个MessageBox并打印出msg参数。

  void CtestMFCDlg:myeventactivexdemo 1 ctrl 1(LPCTSTR msg)

  {

  //TODO:在此添加消息处理程序代码

  MessageBox(msg);

  }

  同时注意,上面常见事件中定义的Click事件处理函数ClickActivexdemo1ctrl1要注释掉。然后编译运行程序后,双击控件会弹出HI,MyEvent。对话框。也就是说,因为双击操作触发了我们定义的MyEvent事件,所以调用了MyEvent的handler函数。

  4.方法

  方法是控件对用户开放的一些功能函数,类似于c的类函数,控件有两种类型,一种是常用方法,其实现由父类COleControl提供。自定义方法由开发人员定义,从而为用户提供定制的功能实现。

  常规方法

  COleControl支持两种常用方法:DoClick和Refresh。控件的用户调用Refresh来立即更新控件的外观;调用DoClick用于引发控件的Click事件。

  添加公共方法的操作是在类视图中打开库节点,在本例中是activexdemo1Lib节点。选择第二个节点,在本例中为_Dactivexdemo1,然后从右键菜单中选择“添加方法”以打开“添加方法”向导。

  选择要添加到方法名称中的常用方法。比如DoClick。

  然后,在类视图中选择_Dactivexdemo1,你会看到下面我们刚刚添加的通用方法。同时在这里也可以看到有一个AboutBox方法,是系统自动添加给我们的。它的功能是显示一个About窗口,可以在项目的resource视图中的Dialog下找到并编辑该窗口。

  还要验证这个新添加的方法。或者打开ActiveX控件测试容器,添加这个控件,然后点击工具栏上的红框,也就是调用方法。

  选择我们刚刚在Call Method Pair窗口的方法名中添加的DoClick方法,然后单击Call。还记得这个DoClick是干什么的吗?对了,就是触发点击事件。上面介绍事件时,我们已经添加了Click事件,所以现在调用DoClick就是为了触发我们上面添加的Click事件,所以activexdemo1 Control: Click出现在测试容器主窗口的消息框中。

  那么在开发环境中效果如何呢?

  好了,让我们回到刚才的测试项目。我们先在表单上添加一个按钮,叫做DoClick。稍后,我们将通过点击它来调用DoClick方法。

  然后,为了操作方便,我们先给刚刚添加到对话框的控件添加一个绑定对象变量。右键单击鼠标控制并选择添加变量。

  在添加成员变量向导中添加绑定到此控件的控件变量,如m_activexdemo。

  然后,双击表单中新添加的按钮,即添加该按钮的鼠标点击事件函数,添加如下一行代码,即调用控件的DoClick方法。

  void CtestMFCDlg:onbnclickedbutton 1()

  {

  //TODO:在此添加控件通知处理程序代码。

  m_activexdemo。DoClick();

  }

  最后,编译并运行测试程序,单击DoClick按钮,然后单击Hi。弹出对话框。也就是说,我们通过执行控件对象的DoClick方法来触发控件的鼠标点击事件,于是执行了我们在上面常见事件部分添加的事件处理函数ClickActivexdemo1ctrl1。

  自定义方法

  自定义方法和常用方法的区别在于,自定义方法不是由COleControl实现的。您必须为添加到控件的每个自定义方法提供一个实现。

  添加自定义方法的操作是在类视图中打开库节点,在本例中是activexdemo1Lib节点。选择第二个节点,在本例中为_Dactivexdemo1,然后从右键菜单中选择“添加方法”以打开“添加方法”向导。

  在添加方法向导中添加要自定义的方法的名称、返回值和参数。

  注意有一个内部名,默认与上面的方法名相同,但是也可以修改为其他名称。这个内部名称是控件类中方法的函数名。比如我们这里的方法命名为MyThod,在类视图中选择库接口下的第二个节点,下面就会出现新定义的MyMethod方法。

  选择控件类Cactivexdemo1Ctrl,下面会看到这个类中定义的方法名就是上面指定的内部名MyMethodInner。

  并且该方法的特定功能在该内部功能中实现。例如,我们将MyMethodInner定义如下:

  void cactive xdemo 1 ctrl:MyMethodInner(LPCTSTR msg)

  {

  AFX _ MANAGE _ STATE(AfxGetStaticModuleState());

  //TODO:在此添加调度处理程序代码。

  MessageBox(msg);

  }

  也就是说,要弹出一个消息对话框,消息内容就是参数中传入的字符串。

  然后,我们来测试一下效果。首先,让我们测试ActiveX控件容器。打开“调用方法”窗口。在方法名中,您会看到我们设置了一个MyMethod。选择它,但是很遗憾你会在参数区看到我们定义的msg参数。选中它,然后在下面的参数值中填入你要传递给参数的值,比如hello,然后点击Set Value,最后点击Call。将执行MyMethodInner,即弹出hello消息窗口。

  然后看用控件开发时的效果。

  回到测试项目,记住DoClick按钮,仍然使用这个,但是有一个小问题。因为我们在为这个控件绑定控件变量的时候没有这个自定义方法,所以如果在绑定过程中生成的控件类定义中没有这个方法,我们就无法对它进行测试。为了省事,我们将简单地创建一个新项目,如前所述添加控件,绑定控件变量,并在DoClick的click事件中编写以下代码:

  void Ct1Dlg:OnBnClickedButton1()

  {

  //TODO:在此添加控件通知处理程序代码。

  m_activexdemo。MyMethod(_T("这是我的方法。"));

  }

  编译,单击DoClick按钮,您将看到这是我的方法消息框。

  5.属性

  属性是向ActiveX控件中的所有容器公开的数据成员。与事件和方法类似,它们可以分为通用属性和自定义属性。

  常用属性

  通用属性已由COleControl类实现。COleControl类包含支持控件公共属性的预定义成员函数。一些常见的属性包括控件的标题以及前景色和背景色。

  添加公共属性的操作是在类视图中打开库节点,在本例中是activexdemo1Lib节点。选择第二个节点,在本例中为_Dactivexdemo1,然后从右键菜单中选择“添加属性”以打开“添加属性”向导。在实现类型下选择通用,并在属性名称下选择要添加的属性。例如,我们在这里选择标题。

  然后,您可以在类视图中看到新添加的属性。

  当我们使用控件进行开发时,此标题是“控件属性”窗口中的标题属性。

  在开发环境中,我们可以使用控件变量的GetCaption和SetCaption来获取和设置控件的这个属性。

  例如,测试项目中DoClick按钮的click事件函数修改如下:

  void Ct1Dlg:OnBnClickedButton1()

  {

  //TODO:在此添加控件通知处理程序代码。

  MessageBox(m_activexdemo。get caption());

  m_activexdemo。set caption(_ T(" change "));

  MessageBox(m_activexdemo。get caption());

  }

  这样,当点击DoClick按钮时,会显示控件的标题名称对话框,然后修改名称,再在弹出的对话框中显示修改后的名称。

  如果是在ActiveX控件测试容器中,我们最好打开调用方法窗口。在方法名中,我们会看到Caption(ProPut)和Caption(ProGet)的方法,它们对应于上面的SetCaption和GetCaption。同样,在这里,我们也可以尝试修改Caption的内容,得到修改后的值。

  自定义属性

  自定义属性不同于通用属性,因为它们不由COleControl类实现。自定义属性用于向使用ActiveX控件的程序员公开该控件的特定状态或外观。

  添加自定义属性的操作是在类视图中打开库节点,在本例中是activexdemo1Lib节点。选择第二个节点,在本例中为_Dactivexdemo1,然后从右键菜单中选择“添加属性”以打开“添加属性”向导。这里有两种自定义属性:成员变量和Get/Set方法。

  成员变量属性

  我们先来看看成员变量的属性。根据需要选择属性类型,并填写属性名称。同时,变量名和通知功能将被自动填充。如果对默认名称不满意,还可以手动修改这两个名称。

  变量名用作control类的成员变量来存储控件的属性。例如,如果在类视图中选择控件类,即Cactivexdemo1Ctrl,将在下面看到这个m_MyProp1成员变量。

  该自定义属性的使用类似于通用属性。在ActiveX控件测试容器中,有MyProp1(ProPut)和MyProp1 (ProGet)等方法要在测试时调用。在开发中,属性还会出现在控件的属性窗口中。在程序中,还可以通过获取myprop1和设置myprop1来获取和设置属性值。

  通知功能是在修改该属性时触发的功能。被定义为控件类中的成员函数。

  例如,假设我们在此函数中编写了以下代码:

  void cactive xdemo 1 ctrl:onmy prop 1 changed(void)

  {

  AFX _ MANAGE _ STATE(AfxGetStaticModuleState());

  //TODO:在此添加属性处理程序代码

  MessageBox(_T("MyProp1已更改。"));

  SetModifiedFlag();

  }

  然后在ActiveX控件测试容器中调用MyProp1(PropPut)来修改这个属性值,就会弹出这个对话框。同样,如果你在开发过程中在属性窗口或者代码中修改了这个属性值,就会触发这个通知函数,然后就会弹出我们代码中的对话框。

  获取/设置方法属性

  要添加获取/设置方法属性,请在“添加属性向导”窗口的实现类型中选择获取/设置方法,并指定属性类型和属性名称。向导将自动填充Get和Set函数,同时,您可以指定用户定义的参数。

  然后在控件类的定义中会出现两个函数GetMyProp2(void)和SetMyProp2(LPCTSTR newVal),分别用来获取和设置属性值。但需要注意的是,如果看这两个函数的代码,这两个自动生成的函数实际上并不具备获取和设置属性值的功能。这只是两个框架,基本上什么都没做。如果在ActiveX控件测试容器中调用这两个函数,不会看到任何反应,所以我们需要手动定义函数的具体作用。

  例如,我们可以为control类添加一个成员变量来存储我们的属性值。因为我们的属性定义了BSTR类型,所以我们可以将添加的成员变量声明为CString m_MyProp2,然后修改GetMyProp2(void)和SetMyProp2(LPCTSTR newVal ),如下所示:

  BSTR cactive xdemo 1 ctrl:getmy prop 2(void)

  {

  AFX _ MANAGE _ STATE(AfxGetStaticModuleState());

  CString strResult(m _ my prop 2);

  //TODO:在此添加调度处理程序代码。

  返回strResult。AllocSysString();

  }

  void cactive xdemo 1 ctrl:setmy prop 2(LPCTSTR new val)

  {

  AFX _ MANAGE _ STATE(AfxGetStaticModuleState());

  //TODO:在此添加属性处理程序代码

  m _ MyProp2=newVal

  SetModifiedFlag();

  }

  然后,在ActiveX控件测试容器中,调用SetMyProp2为属性赋值,然后使用GetMyProp2返回新赋值的属性值。

  另外需要注意的是,刚才定义这个属性的时候,参数列表是空白的,默认得到上面两个函数,SetMyProp2和GetMyProp2。如果参数列表中添加了其他参数,新添加的参数将被添加到这两个函数的参数列表中。例如,如果我们添加一个BSTR属性MyProp3,并在参数列表中添加一个LONG arg参数,那么这两个函数将是GetMyProp3(LONG arg)和SetMyProp3(LONG arg,BSTR newVal)。

  6.属性页

  页面使ActiveX控件用户能够查看和更改ActiveX控件属性。您可以通过调用“控件属性”对话框来访问这些属性。此对话框包含一个或多个属性页,这些属性页为查看和编辑控件属性提供自定义的图形界面。

  使用默认属性页。

  ActiveX控件项目创建后,系统会自动为我们添加一个属性页类,这里是Cactivexdemo1PropPage。同时,在对话框资源中还会有一个属性页对话框资源,这里是IDD_PROPPAGE_ACTIVEXDEMO1。

  单击ActiveX控件测试容器中工具栏上的属性按钮,您将看到此属性页对话框。

  比如像下图。当然,这上面还什么都没有。

  如果控件用于开发,选中控件后,点击属性窗口中的属性页按钮,打开此属性页,开发者可以在此弹出的属性页窗口中设置控件的属性。

  如果要通过属性页修改控件属性,应该通过在属性页上为用户放置一些控件来修改属性值。比如我们在上面添加了一个Caption属性,我们想在属性页上提供修改这个属性的功能,一般是使用文本输入框。这样,我们在属性页的对话框上放置了一个编辑控件,并将id设置为IDC_EDIT_CAPTION。然后为这个编辑控件绑定一个变量。右键单击这个编辑控件,添加要学习的变量,然后打开它。

  在添加成员变量向导中添加一个新变量,并将其设置为m_caption。这里,注意将类型设置为Value。因为属性是字符串,所以这个地方的变量类型也使用CString。

  然后我们来看看属性页类中的一个DoDataExchange函数。该函数由系统自动调用,以在控件和成员变量之间交换数据。由于我们刚刚将编辑控件绑定到m_caption变量,所以我们在DoDataExchange中编写了这句话DDX _ text (PDX,IDC _ edit _ caption,m _ caption);就是这句话实现了m_caption和编辑控件的数据交换。但此时不能从编辑控件中填充的值自动获取控件的Caption属性,需要一个操作,即DDP _ text (PDX,IDC _ edit _ caption,M _ caption,_ t(" Caption "));通过这种方式,Caption属性被绑定到属性页中的m_Caption变量,这样每当我们修改属性页窗口中的编辑控件内容时,我们就可以修改控件的标题。

  那么完整的DoDataExchange函数应该如下所示。

  void cactive xdemo 1 propp page:DoDataExchange(CDATA exchange * pDX)

  {

  DDX_Text(pDX,IDC_EDIT_CAPTION,m _ CAPTION);

  DDP_Text(pDX,IDC_EDIT_CAPTION,m_caption,_ T(" CAPTION "));

  DDP _后处理(pDX);

  }

  另外,注意DDP _后处理是系统自动生成的代码。这句话必须放在DDP _文本和DDP _文本之后,否则无法实现控件属性和属性页上控件的绑定。此时,我们可以在设计时通过这个属性页来修改标题属性,而不是通过程序代码来修改。

  添加其他自定义属性页

  默认情况下,只有一个属性页。如果要设置的属性太多,您需要添加另一个自定义属性页。

  添加新属性页的方法如下:打开VS的资源视图,添加新的对话框资源。

  这里我们选择IDD_OLE_PROPPAGE_SMALL,当然也可以选择and Large。将这个新的资源ID命名为IDD_OLE_PROPPAGE_SMALL。

  然后,您需要为这个资源创建一个新的关联类。关联的类应该是MFC类,类名应该是CPropPage1,基类应该是COlePropertyPage。对话ID选择新添加的对话资源ID。

  然后,打开控件类Cactivexdemo1Ctrl的cpp文件,找到属性页的宏声明部分。

  BEGIN _ prop pageids(cactive xdemo 1 ctrl,1)

  prop pageid(cactivexdemo 1 prop page:guid)

  END _ prop pageids(cactive xdemo 1 ctrl)

  我们添加这个新的属性页,并将属性页计数加1。

  //TODO:根据需要添加更多属性页。请记得向上数!

  BEGIN _ prop pageids(cactive xdemo 1 ctrl,2)

  prop pageid(cactivexdemo 1 prop page:guid)

  PROPPAGEID(CPropPage1:guid)

  END _ prop pageids(cactive xdemo 1 ctrl)

  这样,新添加的属性页就附加到了控件上,当您打开控件的属性页时,会看到多了一个属性页。

  常用属性页

  除了根据需要定制属性页,系统还为开发者提供了一些预制的常用属性页,如颜色、字体等属性页。MFC为ActiveX控件提供了三个常用的属性页:CLSID_CColorPropPage、CLSID_CFontPropPage和CLSID _ CPicturePropPage。这些页面分别显示通用颜色、字体和图片属性的用户界面。

  要将这些属性页合并到控件中,只需将它们的ID添加到初始化控件的属性页ID数组的代码中。即类控件Cactivexdemo1Ctrl的cpp文件中的PROPPAGEIDS声明修改为以下形式。与自定义属性页一样,您也需要增加属性页的数量。

  //TODO:根据需要添加更多属性页。请记得向上数!

  BEGIN _ prop pageids(cactive xdemo 1 ctrl,3)

  prop pageid(cactivexdemo 1 prop page:guid)

  PROPPAGEID(CPropPage1:guid)

  prop pageid(CLSID _ CColorPropPage)

  END _ prop pageids(cactive xdemo 1 ctrl)

  这样,一个颜色属性页就添加到了属性页中,但是如果要使用这个属性页,就需要添加几个公共属性。例如,如果我们想通过这个属性页设置BackColor和ForeColor属性,我们将根据公共属性一节中的方法添加BackColor和ForeColor属性。编译生成的控件后,单击ActiveX控件测试容器工具栏中的属性。

  在弹出的属性窗口中可以看到这两个属性的设置。

  若要使用颜色属性,则需要调用colcontrol:翻译颜色成员函数。此函数的参数为颜色属性值和可选的调色板句柄。返回值为颜色参考值值,可以将它传递给GDI(GDI)函数,如颜色和创建实体画笔(创建策略)。下例说明如何在绘制控件时使用这两个颜色属性。

  CB rush bb rush(translate color(getback color()));

  colorref cler formance=translate color(getforecolor());

  pdc- FillRect( rcBounds,bb rush);

  PDC-settext颜色(clr forma);

  PDC-draw text(internalgatext(),-1,rcBounds,dt _ single line dt _ center dt _ vcenter);

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: