VS2010 使用控件常见问题

最近一段时间总是在跟以前VC6.0中提供的一些控件打交道。前一段时间做串口通讯的上位机程序,用到了MSCOMM的控件;这几天要做一个图表显示的程序,需要用到NTGRAPH控件绘图。

但是VS2010对控件的支持远远不如VC6.0那么方便。VC6.0当中,你只需要完成控件的注册,然后便可以很自动化的完成这些控件的使用,包括相关头文件的生成,控件与其对象的绑定等等。而在VS中,这些都需要手工操作(可能有自动生成的方法,但是我没有找到)。而往往也就是这些过程的遗漏或者是操作错误,给我们的程序设计带来了很多问题。下面我就以NTGRAPH控件为例来介绍VS2010控件的一般步骤以及常见问题(水平有限,有什么问题欢迎大家指正补充):

第一步:下载并注册控件

http://www.codeproject.com/KB/miscctrl/ntgraph_activex.aspx

这是一个国外关于该控件使用的教程,平台是VC6.0。提供了相关的实例程序。下载该教程内提供的control binaries。解压后得到一个NTGraph.ocx的控件文件。把这个文件复制到C盘WINDOWS下的SYSTEM32目录下。然后运行cmd,cd到该目录,执行命令:

regsvr32 NTGraph.ocx

执行完后,会弹出一个对话框,显示NTGraph.ocx已成功注册。这就完成了控件的注册。

第二步:在工程中添加NTGraph控件

在VS中新建一个工程(一个简单的对话框就可以了),在ToolBox(工具箱)中点击右键,选择Choose Items(选择项)。在新弹出的对话框中,选择COM Components(COM组键)。在里面找到NTGraph Control,选中后点OK。

这样以后,在工具箱中便增加了一个NTGraph Control的控件。

这时,我们便可以将该控件拖入到工程的对话框中。这一点与VC6.0不同的是,在VC6.0中添加控件时,系统会提示是否需要生成相关的类,比如在VC6中添加该控件就会生成3个类(包含3个头文件和3个CPP文件)。而在VS2010中,仅仅是将控件拖入了对话框中,没有为我们生成任何代码,当然这些代码在所有工程中都是一样的,我们完全可以手动的将他们添加进去,或许这就是使用“较先进”的编译器的代价吧。

废话不多说,需要使用这个控件需要向我们的工程中添加以下文件:

头文件:ntgraph.h,font.h,picture.h;cpp文件:ntgraph.cpp,font.cpp,picture.cpp(这些文件都可以从最开始我给出的地址里下载的demo程序中拷贝出来)。

这样我们需要额外添加的文件便添加好了。那么是不是现在我们就可以正常使用这些控件的功能了呢?

很不幸的告诉大家,不是的。这个时候我们在Dlg的头文件中,声明一个CNTraph的对象m_Graph。然后在Dlg的CPP文件的initDlg函数中使用该控件的成员函数,例如:

m_Graph.SetFrameStyle(2);

编译,可以通过。你兴奋了一下。

运行,出错,Assert Failed .... line 407。你郁闷了。

其实稍微想想,便可以得到这个问题的答案和解决办法。我们仅仅是添加了这个控件,然后在DLG中声明了一个类的对象。但是这两个东西没有绑定到一起啊。也就是说我们完全没有对这个控件进行初始化操作。导致执行程序的时候该控件对应的控件指针m_pCtrlSite为空,这便导致了Assert Faild的错误。

下面便说说如何将这两个东西绑定到一起。

第二步:控件对象与控件的绑定

其实很简单,只需要在包含该控件的对话款的DoDataExchange函数中添加这样一条语句:

DDX_Control(pDX, IDC_NTGRAPHCTRL1, m_Graph);

其中,第二个参数是控件的ID,第三个参数是该实例化对象的变量名。

OK,再次编译,调试。没有错误了,接下来便可以自由的调用这个控件所提供的成员函数来做你想做的事情了。

具体的程序如何设计大家可以参考本文所提供的链接地址给出的示例以及示例程序,说的很详细。

posted @ 2011-07-15 21:30  zyx2007  阅读(3868)  评论(0编辑  收藏  举报