c++如何创建窗口,c++做窗口程序
介绍
本文介绍了如何在C window中集成C#窗体(也称Windows窗体)。我们的C窗口是使用纯Win32 API函数创建的,没有MFC。
背景
一般来说,用C#编程Windows要比用C容易得多,尤其是当我们不能使用MFC库的时候。所以很多程序员喜欢用C#环境来搭建自己的项目。但有时需要用C环境编程。比如你要在C程序上开发一个附件软件的时候。我们解决这个问题的方法是为它开发一个插件,比如著名的记事本程序。记事本是用C语言写的,专门用纯Win32 API函数和STL保证其运行速度高,可执行文件更小。但是缺点是界面的设计和开发比较困难。因此,面对这一挑战,我们决定使用C#来创建我们的插件。我们如何才能成功地整合我们的?用纯Win32 API函数创建的windows . NET插件?希望这篇文章能帮助你理解这一点。
我们为这篇文章准备了一个小例子。如果您想查看我们记事本插件的所有源代码,请访问我们的插件主页。
用C#语言创建ActiveX控件
基础知识
这部分解决方案基于摩根斯金纳发表的文章《以ActiveX控件的形式暴露Windows窗体控件》。虽然Skinner提供了他的解决方案是由Visual Studio 8的测试版开发的,但是他的例子在VS8的发行版中工作得很好(只有很小的变化)。以下是我们对Skinner的解决方案所做的更改列表:
1.将ClassInterface设置为ClassInterfaceType。None(以便我们向COM公开唯一指定的接口)。更多的信息在下一章。
2.该项目应设置为对COM可见。具体来说,在“项目属性”菜单项的“应用程序”选项卡上的“程序集信息”对话框中,选择了“使程序集COM可见”(如下图所示):
3.您还应该为COM互操作性注册项目(请注意,在VS8.0版本中,“Build”属性窗口和测试版具有不同的设计)。当选择此功能时,Visual Studio将自动注册。当项目成功编译时,使用. NET ActiveX控件。(详见下图)
4.在Skinner的文章中,ComUnregisterFunction()函数有一个小错误。以下是正确的功能:
为COM导出显式方法
为了更精确的设计,我们为COM导出指定的方法。每个使用我们控件的外部程序将只访问它们必要的方法。
导出具体方法的最佳方式是创建一个包含所有相关方法的接口。然后,应该向该接口添加特定的属性。表单类应该在这个接口中实现。
使用Microsoft消息系统
我们使用微软的消息系统和VC的项目容器窗口和其他窗口进行通信。我们不处理任何事件,因为如果这样,它将变得更加复杂,并且对我们的解决方案来说是不必要的。
我们将以下代码添加到MyDotNetActiveX类中,以允许消息传输:
编译工程
现在我们准备编译和测试这个控件。Visual Studio会在编译成功后自动注册我们的ActiveX控件。你可以通过免费软件RegDllView查看注册信息。
在ActiveX控件测试容器中测试控件
在我们进入本文的下一步之前,是时候在第三方程序中测试我们的控件了。我们使用ActiveX控件测试容器(tstcon32.exe)进行测试。这个程序可以在Visual Studio的安装目录中找到。
1.通过“编辑”菜单栏中的“插入新控件”菜单项插入控件。
2.现在选择“控制”菜单栏中的“调用方法”菜单项。
3.在方法名称组合框控件中选择setButtonCaption函数。
4.在参数值文本框中输入“Hello ”,然后按“Invoke”按钮
5.这是测试结果。
向C窗口添加C# ActiveX控件
使用ATL控制容器
您可以使用活动模板库(ATL)来包含ActiveX控件。
在这部分指南中,我们将完成以下工作:
1.创建一个cw32应用程序项目。
2.将我们的ActiveX控件插入C窗口
3.向ActiveX控件发送命令
4.从我们的ActiveX控件接收消息
创建cw322应用程序项目
1.创建一个新的Win32项目,并将其命名为“CPP_Container”:
2.使用默认设置并按“确定”按钮:
在C窗口中插入C# ActiveX控件
1.将以下代码添加到CPP_Container.cpp的开头:
2.当Visual Studio编译我们的C#项目时,它创建了DotNetActiveX.tlb文件。这个文档包含了这个项目的所有方法和结构。我们将通过以下命令导入这些数据:
3.将以下函数添加到CPP_Container.cpp中。该函数将ATL容器插入到窗口中,并加载我们的C# ActiveX控件:
4.为了更精确的开发,在WndProc函数中的WM_DESTORY消息处理块中添加以下代码(注意:销毁C# ActiveX控件窗口,释放加载的内存)。
5.最后,调用_tWinMain函数中的loadActiveX函数。
向C# ActiveX控件发送命令
插入TLB文件后,我们在C#项目中导出的所有方法都会显示出来。现在我们简单地调用相关的方法:
这将把按钮的标题改为“Hello World!”。
从C# ActiveX控件接收消息
通过微软的消息系统,来自C#控件的消息可以到达C窗口。通过调用loadActiveX函数,我们将窗口句柄发送给了C#控件。所以,现在,我们只需要给WndProc函数添加一些代码(注意:消息处理代码)。WndProc函数负责处理到达该窗口的每个消息。因此,我们将向该函数添加另一个case分支:
现在,您可以按下C# ActiveX控件中的按钮,并看到以下结果:
结论
我们希望这篇文章能对在项目中使用C#和C语言的开发人员有所帮助。你可以查看我们的记事本插件:用于记事本的CSSExplorer插件。上面提到的所有想法都已经在我们的插件中实现了。
参考
1.C#编程指南-示例COM类(C#编程指南)
2.如何向Visual C中的任何窗口添加ATL控件包含支持
3.将Windows窗体控件公开为ActiveX控件
历史
2009年10月10日:首次提交
批准
本文,包括所有相关的源代码和文件,遵循代码项目开放许可(CPOL)的许可协议。
关于作者
丹尼尔亚诺夫斯基:职业:软件开发工程师。国籍:以色列。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。