VC/MFC如何使用WPF?

sjdev 2010-05-02 11:05:31
加精
VC/MFC中如何使用WPF?

前些日子我写了一篇关于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>,然后添加以下代码:

<!--设置窗口背景-->
<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模块进行包装了,看以下代码:
// 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还有一定的市场.
...全文
11050 210 打赏 收藏 转发到动态 举报
写回复
用AI写文章
210 条回复
切换为时间正序
请发表友善的回复…
发表回复
亓神 2011-10-08
  • 打赏
  • 举报
回复
xuqinhaow 2011-09-29
  • 打赏
  • 举报
回复
不错。。。
  • 打赏
  • 举报
回复
碰到这种文章不搜藏简直是造孽啊
czy20101207 2011-08-11
  • 打赏
  • 举报
回复
要好好学呀啊
kisshujinwen 2011-05-25
  • 打赏
  • 举报
回复
必须回复
longkid168 2011-05-16
  • 打赏
  • 举报
回复
可以噢,支持,learning
缘梦逍遥 2010-09-20
  • 打赏
  • 举报
回复
好好学习 天天向上
youngvc05 2010-08-26
  • 打赏
  • 举报
回复
呃,学习一下
huazhano3 2010-06-19
  • 打赏
  • 举报
回复
没看书,完全不行。
sureandrew 2010-05-17
  • 打赏
  • 举报
回复
MFC悲剧了。
youhun1990 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 mrlen 的回复:]

你好,我想知道,这样,和C#+WPF,有什么较为区别吗?
[/Quote]
就是啊。。。我也是用的vc
Bone2 2010-05-07
  • 打赏
  • 举报
回复
强帖 ,学习!
wk99239 2010-05-07
  • 打赏
  • 举报
回复
不错,好思路值得学习!
shaonew 2010-05-07
  • 打赏
  • 举报
回复
定下,哈哈哈哈哈哈
wwh159 2010-05-07
  • 打赏
  • 举报
回复
非常感谢,顶
hiweiyi2000 2010-05-07
  • 打赏
  • 举报
回复
我是来学习的。谢谢楼主的分享。
guguangshuai1987 2010-05-07
  • 打赏
  • 举报
回复
非常好。
wukubobo 2010-05-07
  • 打赏
  • 举报
回复
或许留有用处
  • 打赏
  • 举报
回复
拿来用一下
tj_swjtu 2010-05-06
  • 打赏
  • 举报
回复
谢谢 楼主辛苦了
加载更多回复(186)

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧