somethingfly 发表于 2010-5-24 19:26:10

MFC中调用C#的dll界面控件

本人一直用MFC,也只习惯看MFC的框架。最近因为要用到一个数据接口库,其实就是一个dll,没有文档,我不知道怎么调用这个库,于是下了一个国外的源码,发现整个工程是C#写的,于是感到困惑,难道非C#不可了?无奈之中补习了几天C#的知识。后来我发现,这个dll只是建立了一个共享内存的映射文件而已,完全可以按照C#的方式来改成VC的代码,从而又可以用我熟悉的MFC来编程了。

回过头来想想,其实我们写上位机软件,决定用什么语言,用什么框架时,往往判断标准不是哪个好,哪个不好,而是自己熟悉什么就用什么或者原始工程是什么就用什么。

我想大多数人现在用C#,要么是他一开始就学习了C#,要么就是做项目的时候,最原始的基础工程就是C#的,要么就是看中了C#漂亮的界面。

其实,MFC能做到的,C#也能做到,C#能做到的,MFC也能做到。这些都是微软的,必然存在联系。

下面我就来介绍一下,MFC中如何调用一个C#编译的DLL界面类的控件。

起因是我在学C#的时候,偶然在codeproject上,发现了一个C#编写的仿照vista风格的漂亮的按钮界面,于是我萌发了在mfc中调用这个按钮控件的想法。

(漂亮的按钮界面)
http://cache.amobbs.com/bbs_upload782111/files_29/ourdev_556592.jpg
(原文件名:4.jpg)

控件名为VistaMenuControl.dll


首先是要让你的mfc工程包含这个dll,下面两行不可少

#using "VistaMenuControl.dll"   //换成需要的dll文件
using namespace VistaMenuControls;//换成dll中类所使用的namespace


接下来是添加这个控件。mfc中的普通控件可以直接由工具箱中拖过来使用,但这种类型的控件只能在窗口的类声明中加下面一行代码添加。

CWinFormsControl<VistaMenuControls::VistaMenuControl> h;//h是这个控件的名字,


最后在是你的工程里面合适的地方去调用这个控件的相关设置函数了。
需要注意的是,添加代码的函数前必须加#pragma managed,这个是解决MFC能够调用C#的dll的关键地方,MFC是非托管的,C#是托管的。托管有点类似java的概念,java必须有虚拟机,才可以在任意平台上运行,C#也必须装framework才能运行,所以mfc要运行C#的东西,必须设置为兼容托管的。


当然在调用控件的设置函数的时候,还需要注意C#函数的接口必须想办法转为MFC能够认识,这里我就不多讲了。具体可以看下代码里面mypc.png等图片资源是怎么传入的。

最后是mfc显示效果:
http://cache.amobbs.com/bbs_upload782111/files_29/ourdev_556593.jpg
(原文件名:Noname.jpg)


我写这些其实是为了说明,mfc和C#其实是有联系的,高级语言更应该能够相互转化。

以下是源代码,供大家参考。

这个是codeproject上下载的原始代码ourdev_556594.rar(文件大小:700K) (原文件名:cool menu.rar)
这是我的mfc工程 ourdev_556595.rar(文件大小:6.59M) (原文件名:02.rar)

edawn 发表于 2010-5-24 20:03:47

多谢楼主,学习一下。

STM8L103 发表于 2010-9-11 13:52:25

拜读

anda_wei 发表于 2010-11-29 10:55:54

不知道楼主有wince的相应漂亮界面没

lanmanck 发表于 2013-9-6 09:14:43

anda_wei 发表于 2010-11-29 10:55 static/image/common/back.gif
不知道楼主有wince的相应漂亮界面没

WinCE这种过时货你还用啊?

lanmanck 发表于 2013-9-6 10:47:05

这个鸟楼主,mfc程序编译不过,找不到dll,下了c#编译成dll放进去,又报错文件找不到,你Y就不能提供一个完整的工程吗?

skyformat 发表于 2013-9-9 21:53:11

呵呵。自己动手,改好了。完全可编译。

楼主还是很牛的啊。提供了一个很好的方法。嘿嘿。。。学习了。。
注意 : 那几个png文件必须和exe放在一起运行。

xukaiming 发表于 2014-2-5 03:31:39

东西不错,好,有c# 生成com的教程吗?

guoj 发表于 2014-2-5 07:16:42

很久不写程序了

farmerzhangdl 发表于 2014-2-5 20:21:31

我觉得楼主是不是搞反了,这种情况下最好是用C#来调用C++写的dll库好了。你这么搞,也同样需要安装.net framework,也需要mfc的dll,不如大部分用C#搞,非用不可的地方再用C++搞动态库。

xukaiming 发表于 2014-2-6 10:15:00

farmerzhangdl 发表于 2014-2-5 20:21
我觉得楼主是不是搞反了,这种情况下最好是用C#来调用C++写的dll库好了。你这么搞,也同样需要安装.net fra ...

g刚开始的工程是c++,怎么一转换

farmerzhangdl 发表于 2014-2-6 15:22:47

xukaiming 发表于 2014-2-6 10:15
g刚开始的工程是c++,怎么一转换

如果刚开始就是C++,那就应该去寻找C++的界面库,BCG,XTreme或者DirectUI这些,在C++程序中嵌入C#的界面控件,我觉得增加的软件体积及可能造成的麻烦比好处要多。

xukaiming 发表于 2014-2-7 07:59:47

farmerzhangdl 发表于 2014-2-6 15:22
如果刚开始就是C++,那就应该去寻找C++的界面库,BCG,XTreme或者DirectUI这些,在C++程序中嵌入C#的界面 ...

没有c#的控件好,要么收费,要么丑的死

farmerzhangdl 发表于 2014-2-7 09:59:48

xukaiming 发表于 2014-2-7 07:59
没有c#的控件好,要么收费,要么丑的死

c#的好看的控件也是收费的,比如说最出名的DevExpress,收费不菲。而且我认为C++的确可以做非常漂亮的界面,可以去看下BCG的demo,或者金山卫士的界面都是C++的。
主要的问题我认为一般的程序架构应该是C#+(C++)dll,而不是反过来,反过来有两个问题,一是无端的增加了.net framework的体积,二是在调用的时候往往会出来意想不到的问题。

xukaiming 发表于 2014-2-7 11:17:40

farmerzhangdl 发表于 2014-2-7 09:59
c#的好看的控件也是收费的,比如说最出名的DevExpress,收费不菲。而且我认为C++的确可以做非常漂亮的界 ...

他这个用了C++.Net 我觉得就是C#了,只是换了个语法而已.

xukaiming 发表于 2014-2-7 11:20:01

VC的界面库有好的推荐吗?
codejock的界面倒是挺多的

farmerzhangdl 发表于 2014-2-7 12:12:59

xukaiming 发表于 2014-2-7 11:17
他这个用了C++.Net 我觉得就是C#了,只是换了个语法而已.

噢,如果用了C++.net那倒是可以这么调用,不过用C++.net。。。有什么想不开的呢?直接用C#好了

farmerzhangdl 发表于 2014-2-7 12:13:30

xukaiming 发表于 2014-2-7 11:20
VC的界面库有好的推荐吗?
codejock的界面倒是挺多的

我上面说的几个库都是VC的,可以网上搜一下

xukaiming 发表于 2014-2-7 16:36:18

farmerzhangdl 发表于 2014-2-7 12:13
我上面说的几个库都是VC的,可以网上搜一下

我想找这么一控件可以编辑单元格子的Listctrl ,结果我发现好多Listctrl在滚动的时候编辑单元格会出现重影不消失,甚至编辑窗口可以滚动到标题栏上,连projectcode 上面的xlistctrl也一样,有办法解决吗?

farmerzhangdl 发表于 2014-2-7 17:11:24

xukaiming 发表于 2014-2-7 16:36
我想找这么一控件可以编辑单元格子的Listctrl ,结果我发现好多Listctrl在滚动的时候编辑单元格会出现重 ...

去找下bcg看看,我没发现有控件出现这样问题的

xukaiming 发表于 2014-2-21 11:18:14

farmerzhangdl 发表于 2014-2-7 17:11
去找下bcg看看,我没发现有控件出现这样问题的

bcg 的控件是GRID,不是listctrl

william_rain 发表于 2014-2-21 12:23:05

有空学习一下!!

licheng0620 发表于 2016-3-2 16:02:05

奇怪的用法
页: [1]
查看完整版本: MFC中调用C#的dll界面控件