VC/MFC中如何使用WPF?

来源:互联网 发布:知乎的应用场景 编辑:程序博客网 时间:2024/06/11 23:50
前些日子我写了一篇关于C++/CLI的东西——《有多少人在使用C++/CLI》。后来发现完全没搞头。估计是因为我本人对C++/CLI了解的还不深入。一个对某些东西还完全不了解的人却想要向别人解释这个东西,呵呵,多半情况下是完全没搞头的,不是吗? 

介绍WPF的文章很多了,我也只是简单了解WPF,所以不准备对WPF做太多的介绍。大家都说WPF做界面很炫——连QQ都搞个基于WPF的“概念版QQ”——如果能在VC/MFC中使用WPF将会是一件很cool的事情。其实通过CLR,在VC/MFC中使用WPF是完全可行的(《有多少人在使用C++/CLI》中简单地提到了)。下面来看看吧:

首先,创建一个基于MFC的应用程序,工程取名任意,然后一路默认。
MFC工程完成之后不要急着编译,向解决方案中再添加一个“WPF应用程序”的工程。我安装的是中文版的VS2008,在【文件】【新建】【项目】【Visual C#】中可找到“WPF应用程序”项目模板,工程任意,然后一路默认。
WPF做界面很简单,这边简单做个渐变。

打开Window1.xaml(WPF应用程序向导生成的文件),去掉<Grid></Grid>,然后添加以下代码:
XML/HTML code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    <!--设置窗口背景-->
    <Window.Background>        
        <LinearGradientBrush>
            <GradientStop Color="Red" Offset="0.25"/>
            <GradientStop Color="Orange" Offset="0.5"/>
            <GradientStop Color="Yellow" Offset="0.75"/>
        </LinearGradientBrush>
    </Window.Background>  
     
    <!--定义文本-->
    <TextBlock Text="Hello WPF!" 
               HorizontalAlignment="Center" 
               VerticalAlignment="Center" 
               FontSize="21"/>


  如果没什么意外,在添加上面的代码并保存之好,就应该能看到设计的效果了。如果想看看运行的效果,编译一下,运行生成后的EXE试试。

  WPF工程搞定了,但MFC工程中还不能使用。我们还需要做以下工作:
1.在VC/MFC工程属性中添加WPF项目的程序集引用。
2.添加VC/MFC工程的“公共语言运行时支持”。
3.对使用的项进行包装。

  好了,下面得转到MFC工程上来了,打开MFC工程的属性窗口。选择【通用属性】【框架和引用】,这时右侧窗口中就可以添加引用了。点击“添加新引用(N)…”按钮,这时系统会弹出“添加引用”对话框,选择“项目”TAB页,我们的WPF项目会列在其中,选择它点击“确定”。只是添加WPF项目的引用还不够,还需要添加WindowBase、 PresentationCore、PresentationFrameWork的引用,这些可以在“添加引用对话框”“.Net”TAB页面中找到。
  同样是在MFC的工程属性窗口中,选择【配置属性】【常规】,在右侧参数列表中找到“公共语言运行时支持”,选择它的值为“公共语言运行时支持(/clr)”。
  参数设置完毕了,需要对WPF模块进行包装了,看以下代码:
C/C++ code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// wpfHost.h
using namespace System::Windows;
 
ref class WPFHost 
{
public:
  static WPFApp::Window1^ WPFWindow;
  //WPFApp需要跟你的WPF工程名字一致,下同
};
void ShowWPFWindow()
{
  WPFHost:: Window1= gcnew WPFApp:: Window1 ();
  WPFHost:: Window1->ShowDialog();
}


  代码不做解释了,MSDN上有几篇专门的文章介绍了如何在Win32/MFC中使用WPF,有兴趣的自己翻阅一下。把这个wpfHost.h添加到MFC工程中,然后随便添加个按钮并添加响应函数,调用ShowWPFWindow,运行程序看看吧。



以下是楼主回复大家的内容,也希望在和大家一起讨论,现编辑在帖子里,属版主行为,为保证楼主的观点不被加工而产生歧义将原文无删减引用,原文见146楼

呵呵,没想到两天没看回了这么多帖。加个补充吧:
1.感谢版主推荐,让这个帖子有机会让更多的人看到。

2.“C#+WPF有什么区别吗?” And “疑惑为什么需要 vc 使用 wpf,为啥不直接c#使用 wpf”

C#是伴随.net而产生的语言,C#+WPF当然不会有什么问题。
这里面存在一个问题:C#+WPF是直接的,而MFC+WPF是间接的。
当然了C#不等于WinForm,事实上WinForm要使用WPF也是间接的(ElementHost),因为MS已经完全重写了WinForm的逻辑。
通过MFC+WinForm也可以使用WPF,不过途径是MFC->WinForm->WPF而不是MFC->WPF。

2.vc6下怎么做啊?
vc6下不支持/clr选项。当然了,并不是说VC6下无法使用。MFC+WinForm或许可以,直接加载xaml文件进行渲染或许也可以。
我没做过vc6+wpf,需要进一步了解一下。

3.WS应该提供WPF模板,在MFC里用WPF是不合理的。And在MFC中使用WPF确实有点不伦不类,能响应消息吗?
是的,win32中也可以这么用。不过相比之下mfc比win32更方便一些不是吗?
MFC里使用WPF是否合理我不知道。不过现在很多产品都使用不止一种应用倒是事实。
如果你的产品用到了webservice,用到了dx,用到了其他各种技术,你会发现用wpf也无非就是一种选择而已,不存在合理不合理之说。
据说(没有调研,不知道真伪)Autocad2010就是MFC+WPF+...等技术完成的.

MFC中使用WPF是可以响应消息的。
至于不伦不类倒不觉得,因为/clr选项就是为这个而生的,封装之后使用的wpf窗口和win32窗口没什么区别。
若说代码的话确实有一些区别,不过不大,因为大部分代码还是MFC代码,只有封装WPF的一小部分代码需要CLI。

引用主任的话”
呵呵, CLI就是可以转化vc和c#的数据类型, 当然也可以建立消息事件处理, 一句话CLI就是vc和c#的粘合剂.

有了cli, vc和c#才能更容易的混合编程. 这个要深入才知道这个语言的优势. 呵呵
比如: 有些项目的代码都是公司积累了好长时间了, 不可能一下全转为c#,   
或者说有些东东的确用c++控制底层对咱们来说更方面点, 前台用wpf.

这样逻辑与界面分离, 既可以让我们专注自己的优势, 又可以快速开发. wpf让美工用blend立马就做出很多c++很难实现的特效.

我的应用一般是vc+wpf界面,或者vc+wpf控件, 更或者是vc+js+Silverlight, 呵呵. 看具体需要了.
如果觉得.net集太大, 推荐vc+Silverlight,呵呵.“

4.为什么是MFC+WPF,而不是C#直接WPF?
引用albertdiao的话“有时候仅仅有些界面需要wpf实现,如果mfc做会很累"

5.我更倾向于,C#用WPF做界面,然后调用C++的DLL
恩,也可以。

6.要是有深入的例子就更好了.
会的,我正在研究,欢迎一起交流。

7.楼主,我在尝试的时候添加引用对话框为什么没有.Net Tab, 难道是配置问题?请楼主指点。
难道是我记错了?回头查查看。

8.被忽悠了,还以为脱离了C#。
直接加载xaml渲染应该可以脱离C#,你试试?

9.MFC已经没有市场了吗?
MFC+WPF方式之所以存在就是因为MFC还有一定的市场.
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魅蓝手机声音小怎么办 魅族2手机锁定了怎么办 flyme的密码忘了怎么办 魅族note3忘记开机密码怎么办 小米3s手机死机怎么办 二手小米手机有账号锁怎么办 小米五指纹解锁失灵怎么办 小米note3指纹解锁失灵怎么办 小米4s手机屏幕失灵怎么办 vivo手机没有otg功能怎么办 头戴耳机压头发怎么办 小米4c很卡怎么办 小米4c玩王者怎么办 小米4s屏幕乱跳怎么办 小米4s手机后壳碎了怎么办 小米5spius开不了机怎么办 小米5s无限重启怎么办 小米5s外屏坏了怎么办 小米5s内屏碎了怎么办 小米4充电没反应怎么办 小米5手机变卡了怎么办 小米5变卡了怎么办 小米手机充电无反应怎么办 小米6相机卡顿怎么办 华为手机玩游戏发热怎么办 华为手机变慢了怎么办 华为p10手机变慢怎么办 华为手机账户密码忘记了怎么办 QQ浏览器无法加载插件怎么办 电脑开了机黑屏怎么办 扫描仪打不开运单扫描怎么办 打印机不支持64位系统怎么办 xp系统dnf闪退怎么办 w10电脑所有程序都打不开怎么办 安卓手机太卡怎么办 系统装到f盘了怎么办 虚拟机占c盘内存怎么办 外机连无线虚拟机显示受限怎么办 使用msdn下载解压后怎么办 路由80端口被占用怎么办 c盘拒绝粘贴文件怎么办