在 Visual C++ 中 建 立 MFC 扩 展 DLL

有经验的Windows编程人员都逐渐放弃了WindowsSDK,而转向能为Windows内置的低级机制提供高级抽象的开发环境。这种转移的一个主要受益者是VisualC++,它依靠MFC库来提供WindowsAPI的面向对象的视图。

MFC是经验丰富的编程人员掌握的有力工具,但它离完美还相距甚远。事实上,我所认识的以MFC编程为谋生手段的人都开发了他或她自己的扩展集合,他们以MFC类作为基础类来派生自己的类。这毕竟是C++的威力。如果某个类不能满足你的需求(而且如果它恰好可以作为设计的开始),你可以从它自由地派生新类并修改你不喜欢的部分。

假设你编写了一个MFC扩展集合,并愿意与公司的其它开发人员共享。你该如何封装这些扩展呢?你可以分发源代码文件或与VisualC++组件库(ComponentGallery)兼容的组件。或许你可以象MFC那样在DLL中封装你的扩展。就象传统的DLL能够导出函数一样,MFC扩展DLL可以导出类。任何动态链接到MFCDLL的应用程序都能动态链接到MFC扩展DLL。作为开发者,你只需使其包括必要的头文件并在应用程序的链接列表中添加DLL导入库

编写MFC扩展DLL困难吗?有了VisualC++MFC的支持,这实际非常轻松。本文解释了如何创建MFC扩展DLL来弥补MFCCToolTipCtrl类的明显不足。一旦意识到其简便性,你会忍不住亲自编写几个MFC的扩展。

编写MFC扩展DLL

从理论角度而言,MFCCTool-TipCtrl类简化了将提示信息(ToolTip)与对话框的控件或窗口的任意区域相关联的过程。(提示信息是当鼠标光标停滞于工具栏按钮或其它UI对象时弹出的小型帮助文本窗口。)但有个问题尚待解决。由于CToolTipCtrl::AddTool不能自动成为提示信息依附的窗口的子类,因此鼠标事件必须手工转交给提示信息控制。这通常意味着你必须自己给窗口建立子类。

如果你给CToolTipCtrl对象下的提示信息控制传送了正确的标志,它应该能给自己创建子类——这显然是被MFC设计组忽略的功能。幸运的是,该疏忽并不难以纠正。只要从CToolTipCtrl类中派生出一个类,用类似的函数代替CToolTipCtrl::AddTool即可,该函数的TTM_ADDTOOL消息使用TOOLINFO结构,它的uFlags域中包含TTF_SUBCLASS标志。更好的方式是用两个函数代替它:它们分别给子窗口和矩形窗口区域添加提示信息。AddTool函数同时支持两者,但在语法结构上创建提示信息的两种方法截然不同。

1和图2显示了名为CToolTip-CtrlExCToolTipCtrl的派生类的源代码。该派生类给它继承的内容添加了两个函数,其一CToolTipCtrl::AddWindow将提示信息与子窗口相关联,其二AddRectangle使提示信息依附于窗口的矩形区域。这两个函数都使用了TTF_SUBCLASS标志以使提示信息的创建过程尽可能简单。假设m_tooltipCtrlCToolTipCtrlEx对象,给控制IDIDC_BUTTON的按钮添加提示信息就非常容易了:

m_tooltipCtrl.AddWindow(

GetDlgItem(IDC_BUTTON),

"Entertooltiptexthere!");

如何将CToolTipCtrlEx类封装至DLL呢?以下是在VisualC++4.x中的详细步骤:

1.启动VisualC++并通过从File菜单选择New来创建新项目,双击ProjectWorkspace。在NewProjectWorkspaceName框中输入“MfcExt(不带引号)。在Type框中选择MFCAppWizard(dll)。然后点击Create按钮。

2.AppWizardStep1对话框中,通过在“WhattypeofDLLwouldyouliketocreate?”项中选择“MFCExtensionDLL(usingsharedMFCDLL)”。点击Finish按钮,然后点击OK产生DLL的初始代码。注意“MFCExtensionDLL”后括弧中显示的“usingsharedMFCDLL”。当你编写MFC扩展DLL时,不能选择静态链接至MFCDLL必须动态链接到MFC库。

3.弹出ClassWizard并点击AddClass按钮。选择New打开CreateNewClass对话框。在其中标有“Baseclass”的框中选择CToolTipCtrl,在标有“Name”的框中输入“CToolTipCtrlEx”。使用Change按钮将文件名改为Tooltip.hTooltip.cpp。(改变文件名并不是绝对必要的,我这样做是为了避免长文件名。)不要选中“AddtoComponentGallery”框以节省磁盘空间。点击Create命令ClassWizard执行类派生,而后点击OK退出ClassWizard

4.如图2所示,给CToolTipCtrlEx类添加成员函数AddWindowAddRectangle。由于这两个函数要在CToolTipCtrlEx外被访问,因此确定它们都是public的。技巧:在VisualC++中给类添加成员函数的简便方法是在ClassView窗口中右击类名,并从快捷菜单中选择AddFunction

5.ClassView窗口中,双击CToolTipCtrlEx打开类的头文件。在类说明的class关键字后添加AFX_EXT_CLASS(参见图1)。

6.建立项目。你将产生两个重要文件:DLL本身(Mfcext.dll)以及DLL的导入库(Mfcext.lib)。导入库基本上是导出函数名的列表——或者,在本例中是一系列导出类。链接至导入库使应用程序能使用从MFC扩展DLL中导出的类,就如同包含类的库是静态链接的一样。与Mfcext.lib链接还使得Windows知道应用程序需要Mfcext.dll才能运行。

使用MFC扩展DLL

创建使用Mfcext.dll的应用程序是轻而易举的。只要确保在使用CToolTipCtrlEx的每个类中包括Tooltip.h头文件,并且将Mfcext.lib添加至项目的链接库列表中即可。然后CToolTipCtrlEx就可以象普通MFC类那样使用了。当回答AppWizard的询问时一定要选择“AsasharedDLL”,这样你的应用程序才能动态链接至MFC。你可以通过从VisualC++Build菜单中选择SettingsMfcext.lib添加至项目的链接列表中,点击Link标签并在标有“Object/librarymodules”的框中输入Mfcext.lib的路径(参见图3)。

ToolTest是作为样例的应用程序,它在对话框中显示一个按钮。它动态链接至Mfcext.dll并使用CToolTipCtrlEx。该应用程序是基于对话框的,dialog类包含名为m_tooltipCtrlCToolTipCtrlEx成员变量。对话框的OnInitDialog函数中的以下代码创建提示信息控制并给对话框的按钮设置提示信息:

m_tooltipCtrl.Creat(this);

m_tooltipCtrl.AddWindowTool(

GetDlgItem(IDC_EXIT),

"Clickheretoclose");

当光标停在按钮上时,提示信息窗口中显示“Clickheretoclose”。点击该按钮可以关闭应用程序。

你可以从PCMagazineOnlinewww.pcmag.com)下载ToolTestMfcext.dll的完整源代码。从主页左侧的菜单中选择Downloads,然后依次选择PCTechArchives和文件V16n15.zipCompuServeUtilities/Tips论坛(GOZNT:TIPS)上也有该文件。我们的文件包含在该归档文件中。使用PKUNZIP-d开关解压文件(Mfcext.zipTooltest.zip),以便.ZIP文件中的目录也能一同被解压。在运行ToolTest之前,将Mfcext.dll拷贝至Windows系统目录或Tooltest.exe所在的目录。否则,当执行ToolTest时,Windows可能找不到Mfcext.dll。如果你打算建立自己的Tooltest.exe版本,修改ProjectSettings对话框的“Object/librarymodules”框的路径名,使VisualC++能获悉在PC的何处寻找Mfcext.lib文件。

总结

创建MFC扩展DLL非常容易——只要你知道了该如何操作。当你给其它开发人员分发MFC扩展DLL时,不要忘记提供描述DLL中类的头文件以及相应的.LIB文件和DLL本身。此后开发人员就能充分利用你装配的扩展了。


原文链接: http://blog.csdn.net/augusdi/article/details/4642361

你可能感兴趣的:(在 Visual C++ 中 建 立 MFC 扩 展 DLL)