c++如何创建窗口,c++做窗口程序

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: