C++开发WPF,Step by Step

 

C++开发WPFStep by Step

示例代码

使用C++来开发WPF,主要是如何在MFCWin32)的窗口中Host WPFPage。下面我就做个详细的介绍.

一、创建工程, 由于MFCWizard会生成很多用不到的代码,所以我准备从一个空的工程开始创建一个MFC的工程。

a)         打开VS2005,菜单File->New->Projects…, 左面选择Visual C++->Win32,右面选择Win32 Console Application,给工程起个名字CPlusPlus_WPF, Ok进入下一步。见Figure 1

Figure 1 Create Project 1

b)        工程基本配置,在Application Setting中选择Console ApplicationMFC.Finish进入下一步。见Figure 2

Figure 2 Application Setting

c)        修改工程,使工程变成MFC Windows程序。

                                       i.              删除CPlusPlus_WPF.cppCPlusPlus_WPF.h文件


Figure 3 Remove no used files

                                     ii.              添加CWinApp派生类, 在工程上点击鼠标右键,Add=>Class…


Figure 4 Add New Class Menu

                     在弹出的对话框中,左边选择MFC,右面选择MFC Class,点击Add进入下一步


Figure 5 Create New Class Dialog

              在弹出的对话框中输入类名: CCPlusPlus_WPFApp, 基类选择CWinApp


Figure 6 Add CWinApp Derived Class

 

                                       i.              用同上的方法添加CWnd派生类,Class nameCCPlusPlus_WPFMainWnd, Base classCWnd

                                     ii.              修改工程属性。将属性中的System->SubSystemConcole改成Windows,见Figure 7

  
 

Figure 7 Change property

到这一步,一个基本的MFC程序所需要的两个类CWinAppCWnd派生类就添加完了。我们的程序可以顺利编译通过,但是还不能运行,请继续看下一步

d). CCPlusPlus_WPFMainWnd添加代码;
   
l         添加创建窗口函数,函数如下:

BOOL CCPlusPlus_WPFMainWnd::CreateMainWnd(const CRect &rect, DWORD dwStyle, DWORD dwStyleEx)
{
    WNDCLASS wndClass;
    memset(
&wndClass, 0sizeof(WNDCLASS));                                            
    wndClass.style 
= CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
    wndClass.lpfnWndProc 
= ::DefWindowProc; 
    wndClass.hInstance 
= AfxGetInstanceHandle();
    wndClass.hIcon 
= NULL;
    wndClass.hCursor 
= ::LoadCursor(NULL, IDC_ARROW);
    wndClass.hbrBackground 
= (HBRUSH)(COLOR_WINDOW);
    wndClass.lpszMenuName 
= NULL;
    wndClass.lpszClassName 
= _T("__CPlusPlus_WPF_MainWnd__");

    
if(!AfxRegisterClass(&wndClass))
    
{
        
return FALSE;
    }


    
return CWnd::CreateEx(dwStyleEx, wndClass.lpszClassName, _T("C++ && WPF"), dwStyle, 00, rect.Width(), rect.Height(), NULL, NULL);
}

l         继承CWnd类的PostNcDestroy函数,这个函数是CWnd类中的虚函数,是在窗口退出后,最后一个被调用的函数,我们在这个函数里还删除自己。

void CCPlusPlus_WPFMainWnd::PostNcDestroy()
{
    delete 
this;
}

             

e)       CCPlusPlus_WPFApp添加代码

l         把构造函数改由protect改为public

l         定义theApp, CCPlusPlus_WPFAp theApp

l         实现InitInstance()

 

BOOL CCPlusPlus_WPFApp::InitInstance()
{
    CWinApp::InitInstance();

    CCPlusPlus_WPFMainWnd 
*pMainWnd = new CCPlusPlus_WPFMainWnd();
    
if (!pMainWnd->CreateMainWnd(CRect(00800600), WS_OVERLAPPEDWINDOW, 0))
        
return FALSE;

    m_pMainWnd 
= pMainWnd;

    pMainWnd
->CenterWindow();
    pMainWnd
->ShowWindow(SW_SHOW);
    pMainWnd
->UpdateWindow();

    
return TRUE;
}

        编译运行,可以看到窗口了,到这步位置,一个基本的MFC程序就已经建立起来了,大家可以对窗口添加想要的风格。这里就不做详细说明了。

     
二、              进一步修改工程,使其支持WPF

        1.         修改工程属性,在工程属性的GeneralCommon Language Runtime Support中选择/Clr, 这个选项可以让这个工程支持Common Language Runtime. 这样我们的工程里就可以写C++/CLI的代码,用来操作WPF了。

Figure 8 Support clr
        2.         添加References,在工程属性中的左面的树上选择,Common Properties->References(C++程序员好像机会很少用到)

Figure 9 Add References

          点击Add New Reference按钮,弹出如下对话框                            

 

           顺次添加如下.NET dlls. 到现在位置,这个工程就已经完全支持WPF了
                
 
        3.         添加显示WPF的部分
            
a)         创建一个XAML文件,我已经上传一个,Clock.XAML,这段XAMLWindows SDK中也可以找到。
            
b)        动态读取XAML文件
            
c)        WPFPage HostMFC的窗口中。完整代码如下     

using namespace System;
using namespace System::IO;
using namespace System::Windows;
using namespace System::Windows::Controls;
using namespace System::Windows::Markup;
using namespace System::Windows::Interop;


void CCPlusPlus_WPFMainWnd::CreateWPFWnd()
{
    FileStream
^ pStream = File::OpenRead("Clock.XAML");
    
if(pStream == nullptr)
        
return;

    Page
^ pMainPage = (Page^)XamlReader::Load(pStream);

    pStream
->Close();

    CRect rcClient;
    GetClientRect(
&rcClient);

    Rect
^ rect = gcnew Rect(00, rcClient.Width(), rcClient.Height());

    HwndSourceParameters
^ sourceParams = gcnew HwndSourceParameters(gcnew String("WPFWnd"));
    sourceParams
->PositionX = Int32(rect->X);
    sourceParams
->PositionY = Int32(rect->Y);
    sourceParams
->Height = Int32(rect->Height);
    sourceParams
->Width = Int32(rect->Width);
    sourceParams
->ParentWindow = System::IntPtr(m_hWnd);
    sourceParams
->WindowStyle = WS_VISIBLE|WS_CHILD|WS_CLIPCHILDREN;

    HwndSource
^ source = gcnew HwndSource(*sourceParams);
    
if(source == nullptr)
        
return;

    source
->RootVisual = pMainPage;
}

           d)        CCPlusPlus_WPFMainWnd::OnCreate中调用上面的函数。
            
e)         编译运行,一切Ok了。

当然,这只是基本的步骤,在这个基础上就可以利用C++WPF来开发一个完整的软件了

转载于:https://www.cnblogs.com/sun9411323/archive/2007/12/04/981600.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度、华为、京东、B站最新面试题汇集,实战篇

前言 回顾一下自己这段时间的经历,因公司突然通知裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷。公司开始第二波裁员,我决定主动拿赔偿走人。后续的面试过程我做了一些准备&#xff…

百度、阿里、滴滴、新浪的面试心经总结,一线互联网公司面经总结

开头 技术的发展产生了程序员这个职位,从这些年各大互联网公司曝光的一些员工收入水平来看,程序员的工资还是相对比较高的,可是我们在互联网上还听到了另外一种声音,很多程序员想转行,特别是大龄程序员,这…

百度、阿里、滴滴、新浪的面试心经总结,源码+原理+手写框架

前言 作为一个程序员,如果你在新知识、新技术面前仍一无所知,依然吃着十多年前的老本,那你在知识技术上肯定落伍,如果又未能进入管理层面,那你肯定就会被长江的后浪拍在沙滩上了。 而不少与时俱进、善于学习的程序员…

目前最全的《Android面试题及解析》!面试真题解析

背景 惯例,先简单陈述一下自己的,91年生人,164年三本毕业后在深圳工作,末流小公司,工资13k,无房,无车,无户口。 那时候感觉生活也还行,父母有退休金,我基本…

有效的形成传感器(执行器)的控制方式

其实为了增加闭环的话需要再增加一个传感器,比如编码器。 转载于:https://www.cnblogs.com/yjphhw/p/11285145.html

直接上干货!技术水平真的很重要!复习指南

开头 25岁那年,我从京东离职,入职百度。 在百度认识了当时的架构师久哥(T9级别),因为他的一番话,彻底改变了我的职业生涯,短短三年的时间,我从一枚普通程序员成长为别人眼中的技术…

实战HMM-Viterbi角色标注地名识别

http://www.hankcs.com/nlp/ner/place-names-to-identify-actual-hmm-viterbi-role-labeling.html 命名实体识别(Named Entity Recognition)也是自然语言处理中的一个难关,特别是中文这样没有大小写等固定形态的语言。上次介绍过《实战HMM-Vi…

看完99%的人都学会了!9次Android面试经验总结,我先收藏为敬

我们都是被圈养的人? 我的朋友程序员K,说他在电力行业的一家软件公司做了八年Android开发,用到的各种技术,数据库,网络请求,事件传递,响应框架都很熟悉,甚至JNI/NDK/Framework&…

从外包公司到今日头条offer,含BATJM大厂

前言 最近有不少人问我这样一个问题:「我刚接触编程,准备学习下Android开发,但是担心现在市场饱和了,Android开发的前景怎么样?」 想着可能有很多人都有这样的担心,于是就赶紧写篇文章,来跟你…

PTA -- A1046 Shortest Distance

题意及思路 题意:有N个节点(1至N),求给定的st号到en号的距离最小值,这些点构成一个环,即1->2 ... ->N ->1。 思路:第一步,预处理操作,以dis[ i ] 表示&#xff…

从外包公司到今日头条offer,聪明人已经收藏了!

开头 让我们一起来看看,字节跳动的第三面,面试官都问了什么?(第一二面的题目及答案已整理,需要的可以在文末领取) 从七月中旬开始,我前前后后差不多一共投递了八十份简历,到目前为…

从外包月薪5K到阿里月薪15K,原理+实战+视频+源码

前言 转眼间,2020 年已过去一大半了,2020 年很难,各企业裁员的消息蛮多的,降职,不发年终奖等等。2020 年确实是艰难的一年。然而生活总是要继续,时间不给你丧的机会!如果我们能坚持下来&#x…

C#编写的发送手机短信的类库 C#开发短信的方法和简介 短信编程实例

发送手机短信源代码(针对国内短信编码) / ///文 件:PDUdecoding.cs ///概 要:针对国内短信编码(USC2) ///组成结构:包含四个函数: /// smsDecodedCenterNumber(string srvCenterNumber) …

从新手到Flutter架构师,一篇就够!吐血整理

在开始回答前,先简单概括性地说说Linux现有的所有进程间IPC方式: 1. **管道:**在创建时分配一个page大小的内存,缓存区大小比较有限; 2. 消息队列:信息复制两次,额外的CPU消耗;不合…

从新手到Flutter架构师,一篇就够!学习路线+知识点梳理

前言 IT行业薪水高,这是众所周知的,所以很多人大学都选择IT相关专业,即使非该专业的人,毕业了也想去一个培训机构镀镀金,进入这一行业。 但是有关这个行业35岁就退休的说法,也一直盛传。 加上这几年不断…

从新手到Flutter架构师,一篇就够!帮你突破瓶颈

前言 马上快到金三银四都春招阶段了,在这本就是跳槽、找工作的年后黄金时间,大多数求职者都早早做好年后求职的准备,其中不乏有年前早早辞了工作准备年后跳槽的有经验的职场老人们,也有一批即将毕业的应届毕业生的职场新人们。 …

从新手到Flutter架构师,一篇就够!附赠课程+题库

导语 Android 音视频开发这块目前的确没有比较系统的教程或者书籍,网上的博客文章也都是比较零散的。只能通过一点点的学习和积累把这块的知识串联积累起来。 音视频的开发,往往是比较难的,而这个比较难的技术就是NDK里面的技术。音视频/高…

微信小程序之视图容器(swiper)组件创建轮播图

一、视图容器(Swiper) 1、swiper:滑块视图容器 微信官方文档:https://developers.weixin.qq.com/miniprogram/dev/component/swiper.html 二、swiper应用 1、页面逻辑(index.js) Page({data: {imgUrls: [{l…

从草根到百万年薪程序员的十年风雨之路,使用指南

前言 文章篇幅较长,建议耐心食用,相信对你有帮助。码字不易,如果有误,欢迎指出。 前部分是面试经历,后部分是附带的问题笔记/推荐回答/书籍。 我的微信小号有一组特殊的朋友。他们从 CSDN上看到我之前发布的《从阿里到…

修复png bug的脚本

代码 //IE5.5 PNG Alpha Fix v2.0 Alpha: Background Tiling Support//(c) 2008 Angus Turnbull http://www.twinhelix.com//This is licensed under the GNU LGPL, version 2.1 or later.//For details, see: http://creativecommons.org/licenses/LGPL/2.1/varIEPNGFix windo…