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>,然后添加以下代码:
如果没什么意外,在添加上面的代码并保存之好,就应该能看到设计的效果了。如果想看看运行的效果,编译一下,运行生成后的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模块进行包装了,看以下代码:
代码不做解释了,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还有一定的市场.
介绍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>,然后添加以下代码:
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模块进行包装了,看以下代码:
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还有一定的市场.
- VC/MFC中如何使用WPF?
- VC/MFC中如何使用WPF?
- VC/MFC中使用WPF
- VC/MFC中使用WPF
- VC++非MFC项目中如何使用TRACE宏
- VC++非MFC项目中如何使用TRACE宏
- 在MFC中使用WPF技术
- 在MFC中使用WPF技术
- 在MFC中使用WPF技术
- 在MFC中使用WPF技术
- VC/MFC中如何自定义消息
- VC/MFC中如何自定义消息
- VC/MFC中如何自定义消息
- 使用vc,c#,wpf
- 怎样在VC中使用MFC。。
- VC++ MFC中 使用BMP按钮
- VC MFC中CList成员的使用
- vc++ win32程序中使用MFC
- TCP/IP Network Layer Protocols
- nyoj-871-比赛
- ssh常用用法小结
- linux 下iptables 执行清除命令 iptables -F 要非常小心
- 硬件创业的精益时代:从原型到生产都是泪
- VC/MFC中如何使用WPF?
- Linux设备模型之tty驱动架构分析
- 每天一个linux命令(1):ls命令
- 广义表创建二叉树
- 每天一个linux命令(2):cd命令
- pickle 用法 reference
- vc++中编写Dll,在C#(WPF)中引用
- 为第一篇写序
- 二叉树的实现 Java版