问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在MFC中使用WPF技术

发布网友 发布时间:2023-04-25 08:52

我来回答

1个回答

热心网友 时间:2023-10-15 04:29

  一 介绍

  本文将以一个实例来说明如何将WPF技术集成在基于MFC的应用程序中 这种技术的主要目的是为了增强基于Win /MFC的应用程序的在图形方面的表现能力 本文所提供的演示程序将在MFC对话框架应用程序中显示一个WPF动画时钟 界面如图 所示

  

  

  本文需要的开发工具和开发库    为了建立和运行demo程序 我们需要安装如下的组件

   Visual Studio 或Visual Studio     NET Framework 或 NET Framework

  所需要的平台    demo程序必须在下面支持 NET Framework 的操作系统平台上运行

   Windows Vista   Windows XP SP    Windows Server SP

  如果你是一名C++开发人员 并且想使用WPF技术来增强自己的基于Win /MFC应用程序 本文非常适合你 为了能从本文学习到更多的知识 我们需要熟悉VC++/CLi MFC XAML和C# 但是 如果我们不了解C#或XAML 我们仍然可以通过引用现成的DLL来使用WPF程序   

  二 什么是WPF

  WPF是Windows Presentation Foundation的缩写 它是微软 NET Framework 的一个子系统 这种技术允许开发人员高效地创建可视化的应用程序 并改善用户体验 由于WPF的发布 使用Windows程序在富控件的设计 开发上更如虎添翼 WPF主要关注一套应用程序服务 用户接口 D和 D 矢量图 动画 数据绑字 音频 并提供一个在UI和商业逻辑之间的非常清晰的界限

  WPF API是被管制的代码 但是大多数Win /MFC程序是非管制的C++代码 按著惯例 WPF API不能通过非常制程序调用 然后 通过使用VC编译器的/clr选项 我们可以建立一个由管制和非管制混合而面的系统 在这个系统中 我们可以使管制和非管制代码无缝地混合在一起

  有一个要注意的是在C++工程中不允许编译XAML文件 因此 我们必须建立一个包含在本例中所需要的所有XAML而的C# DLL 然后在C++工程中包含这个Dll引用

  有两种基本的技术可以融合WPF和Win /MFC代码

   将WPF放到Win /MFC程序中 使用这种技术 开发人员可以使用WPF的高级图形能力来渲染Win /MFC应用程序

          将Win /MFC放到WPF中 使用这种技术 开发人员可以在WPF中使用已经存在的

  Win /MFC控件 并通过一定的机制来传递数据

  在本文中将采用第一种方法  

  三      融合Win /MFC和WPF程序

  上面部分所说的是本例的基本规则 下面在本节中将介绍如何编写具体的实现代码 在本例中 我首先会演示使用XAML和C#建立WPF内容 并在VC++中引用这个DLL

  本例的目的是建立一个用于设置日期和时间的设置工具 其中动画部分使用WPF实现 程序的其他部分仍然使用MFC实现

  这个演示程序由两部分组成 一个是MFCHostMPF(由VC++/MFC代码组成) 另一个是WPFControls(由XAML和C#代码组成) 这个MFCHostWPF工程将由WPFControls工程所产生的DLL作为一个外部的引用 如图 所示

  

  

  向MFC工程中加入一个WPF引用 如图 和图 所示

  

  

  

  

        三 在MFC应用程序中加入和WPF相关的代码

  先提一下 gcnew关键字被用于建立一个管制类型的实例 在本例中将建立一个垃圾回收集合栈的实例 所有被gcnew分配的内存空间将被垃圾回收器自动管理 而开发人员并不需要为什么时间释放它们而操心

  为了使用WPF程序 关键是System::Windows::Interop::HwndSource类 这个类将在Win 窗口中使用WPF程序 因此 WPF程序可以作为MFC窗口的子窗口放到UI上 而在WPF对象和Win 窗口之间的通讯要通过引用C++程序中被存储的静态字段 这些静态字段的代码如下

  

   ref class Globals { public: static System::Windows::Interop::HwndSource^ gHwndSource; static WPFControls::AnimClock^ gwcClock; };

         HWND hwndWPF;    // 和WPF相关的hwnd    为了建立一个HwndSource 首先需要建立一个HwndSourceParameters结构 这个结构需要如下的参数     类 窗口 窗口类型    窗口的初始位置    窗口的初始尺寸    父窗口    一但我们将HwndSourceParameters结构编写完 就可以将这个结构到HwndSource的构造方法HwndSource(HwndSourceParameters)中     最后 我们将WPF时钟的引用赋值给HwndSource对象的RootVisual属性 并通过调用Handle ToPointer()返回HwndSource的HWND 代码如下

   HWND GetHwnd(HWND parent int x int y int width int height) { System::Windows::Interop::HwndSourceParameters^ sourceParams = gcnew System::Windows::Interop::HwndSourceParameters ( MFCWPFApp ); sourceParams >PositionX = x; sourceParams >PositionY = y; sourceParams >Height = height; sourceParams >Width = width; sourceParams >ParentWindow = IntPtr(parent); sourceParams >WindowStyle = WS_VISIBLE | WS_CHILD; Globals::gHwndSource = gcnew System::Windows::Interop::HwndSource(*sourceParams); DateTime tm = DateTime::Now; Globals::gwcClock = gcnew WPFControls::AnimClock(); Globals::gwcClock >ChangeDateTime(tm Year tm Month tm Day tm Hour tm Minute tm Second); FrameworkElement^ myPage = Globals::gwcClock; Globals::gHwndSource >RootVisual = myPage; return (HWND) Globals::gHwndSource >Handle ToPointer(); }

        因此 无论用户如何变化时钟 我们的MFC代码都会调用RefereshWPFControl()来刷新WPF时钟

   void RefreshWPFControl() { FrameworkElement^ page; DateTime tm = DateTime::Now; Globals::gwcClock >ChangeDateTime(tm Year tm Month tm Day tm Hour tm Minute tm Second); page = Globals::gwcClock; Globals::gHwndSource >RootVisual = page; return; }

        现在我们已经有了大部分我们需要的功能了 而最后的任务是在MFC对话框代码中找个地方调用HwndSource实现创建函数 当然 有很多地方可以做这个工作 但是OnCreate也许是最好的位置 在OnCreate事件句柄中调用GetHwnd()函数的代码如下

   int CMFCHostWPFDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == ) return ; hwndWPF = GetHwnd(this >GetSafeHwnd() ); return ; }

        四 结论lishixin/Article/program/net/201311/11996
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
光线为什么不存在 炒菜时要等到油冒烟吗 高考数学选修没涂有分吗? 高考选修不涂有分数吗 《宫》中插曲是什么乐器演奏的? 电视剧《宫》的主题曲和片尾曲分别是什么? 爱我的人和我爱的人原唱是裘海正还是游鸿明 刑法对追诉时效的规定 刑事案件追诉期限的法律规定是什么? 爱奇艺海外版怎么下载 qq数据清理后会怎么样 大学生体育委员工作计划2021 2021学校体育老师工作计划 2021大学体育部个人工作计划书范文 小学体育教学个人工作计划2021 小区现场制作蚕丝被用的什么机器 蚕茧如何加工成蚕丝 做蚕丝被能把茧做成被子里的是啥东西 开茧机的词语开茧机的词语是什么 开茧机的解释开茧机的解释是什么 辽阳市弓长岭土产日杂有限公司怎么样? 弓长岭选矿厂有单身公寓吗? 教资科目二教学方法 信用卡现金还款超过5万受监控吗 希尔顿荣誉客会会员注册的邮箱错误 vip邮箱怎么申请? 取件码oooooooo是什么意思意思 atlantis丶oooooo什么意思 英文缩写 _ OoO _ OoO是什么意思 qq朋友发oooooo是什么意思 数据库软件,界面用MFC好还是WPF好 因为生意失败导致信用卡逾期怎么办理 wpf打开mfc模态对话框 蜂蜜烧沸腾后还能吃吗? 蜂蜜水用烧红的铁炙有什么功效 用油烧热把蜂蜜热一下好吗 蜂蜜烧开后有没有毒 蜂蜜放勺子里加热后好蜂蜜会怎样? 师生群和家校群可以关联吗 王者荣耀上官婉儿暴力出装推荐 王者荣耀s20上官婉儿出装推荐 王者荣耀国服职业选手Mojo上官婉儿铭文出装一览 王者上官婉儿怎么出装 王者荣耀s20上官婉儿怎么玩 手机qq邮箱账号如何切换 民间中医近期有哪些政策 如果没有行医证,遇到将死之人,你给他治吗? 苹果手机黑屏录像怎么弄 灵畅互动需要测试什么 梦见河里抓鱼有活的有死的的预兆