C++开发WPF,Step by Step

本文详细介绍如何使用C++开发WPF应用,并在MFC窗口中嵌入WPF页面。从创建基本MFC项目开始,逐步引入CLR支持及WPF组件,最终实现在Win32环境中运行WPF界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例代码

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

一、创建工程, 由于MFC的Wizard会生成很多用不到的代码,所以我准备从一个空的工程开始创建一个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 Application和MFC.。Finish进入下一步。见Figure 2

Figure 2 Application Setting

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

                                       i.              删除CPlusPlus_WPF.cpp和CPlusPlus_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 name为CCPlusPlus_WPFMainWnd, Base class为CWnd。

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

  
 

Figure 7 Change property

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

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

BOOL CCPlusPlus_WPFMainWnd::CreateMainWnd(const CRect &rect, DWORD dwStyle, DWORD dwStyleEx)
{
    WNDCLASS wndClass;
    memset(&wndClass, 0, sizeof(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, 0, 0, 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(0, 0, 800, 600), WS_OVERLAPPEDWINDOW, 0))
        return FALSE;

    m_pMainWnd = pMainWnd;

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

    return TRUE;
}

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

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

        1.         修改工程属性,在工程属性的General的Common 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,这段XAML在Windows SDK中也可以找到。
            b)        动态读取XAML文件
            c)        把WPF的Page Host到MFC的窗口中。完整代码如下     

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(0, 0, 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来开发一个完整的软件了

 

原文出处:http://www.cnblogs.com/sun9411323/archive/2007/12/04/981600.html

<think>嗯,用户的问题是关于如何在VSCode中运行WPF项目的,需要哪些配置或插件。首先,我得回忆一下WPF项目通常需要什么环境。WPF是.NET框架的一部分,所以肯定需要.NET SDK的支持。用户之前提到的引用里提到了安装dotnet-sdk,这可能是一个关键点。 接下来,VSCode本身是一个编辑器,不像Visual Studio那样内置了很多项目模板和工具,所以需要确认VSCode是否有合适的插件来支持WPF开发。C#插件是必须的,比如OmniSharp的C#扩展,但WPF可能需要额外的工具,比如XAML设计器或者预览工具。不过VSCode的XAML插件可能功能有限,这点需要提醒用户。 然后,创建WPF项目的步骤应该和命令行有关,因为VSCode通常通过终端来操作。用户可能需要使用dotnet new命令来生成项目模板。但默认的dotnet new是否有WPF模板呢?可能需要安装额外的模板包,比如Microsoft的WPF模板。这里需要确认安装命令,比如dotnet new install来获取模板。 配置方面,用户可能需要修改tasks.json和launch.json来正确构建和调试项目。但WPF项目可能涉及GUI,而VSCode调试控制台应用和GUI应用是否有不同?可能需要调整启动选项,比如使用外部终端或者指定正确的启动文件。 另外,用户提到的引用中有关于C#运行环境的配置,比如安装SDK和插件,这些是基础。但WPF项目可能还需要处理XAML文件的实时预览,这在VSCode中可能没有很好的支持,只能通过运行应用来查看效果,或者使用第三方插件。 还有,用户可能遇到的问题是生成的项目无法运行,可能缺少依赖或者配置错误。需要检查csproj文件是否包含正确的WPF引用,以及运行时是否正确。同时,可能需要安装Windows兼容的SDK版本,因为WPFWindows特有的技术。 最后,用户可能需要了解VSCode在WPF开发中的局限性,比如缺乏可视化设计器,主要依赖手动编写XAML和代码,这对于初学者来说可能比较困难,但如果是学习用途,可能已经足够。还要提醒用户如果遇到复杂情况,可能需要切换到Visual Studio以获得更好的支持。</think>### 如何在 VSCode 中运行 WPF 项目? #### **1. 环境配置** - **安装 .NET SDK** WPF 项目基于 .NET 框架,需安装对应版本的 .NET SDK(建议选择长期支持版本如 .NET 6/7/8)[^2]。 下载地址:https://dotnet.microsoft.com/download 安装后通过命令行验证: ```bash dotnet --version ``` - **VSCode 插件** 必须安装以下插件: - **C#**(由 OmniSharp 提供,支持代码补全、调试等) - **XAML Language Server**(用于 XAML 文件编辑支持) - **.NET Core Test Explorer**(可选,用于测试管理) --- #### **2. 创建 WPF 项目** 1. **通过命令行生成项目** WPF 项目需手动安装模板(默认 `dotnet new` 不包含 WPF 模板): ```bash dotnet new install Microsoft.DotNet.Wpf.ProjectTemplates dotnet new wpf -o MyWpfApp cd MyWpfApp ``` 2. **在 VSCode 中打开项目** 通过 `文件 → 打开文件夹` 加载项目目录,VSCode 会自动检测并提示安装必要依赖[^4]。 --- #### **3. 配置调试与运行** 1. **生成 `tasks.json` 和 `launch.json`** - 按 `F5` 启动调试,选择 `.NET Core` 环境,自动生成配置文件。 - 修改 `launch.json` 确保 `"console": "externalTerminal"`,避免输出被 VSCode 内部终端拦截: ```json "configurations": [ { "name": ".NET Core Launch (Console)", "type": "coreclr", "request": "launch", "program": "${workspaceFolder}/bin/Debug/net8.0-windows/MyWpfApp.dll", "console": "externalTerminal" } ] ``` 2. **运行项目** - 执行 `dotnet build` 编译项目。 - 按 `F5` 启动调试,WPF 窗口将弹出。 --- #### **4. 注意事项** - **XAML 设计器限制** VSCode 无原生 XAML 可视化设计器,需手动编辑 XAML 文件或通过运行实时预览效果。 - **Windows 依赖** WPF 仅支持 Windows 平台,需确保开发环境为 Windows,且 SDK 包含 `-windows` 后缀(如 `net8.0-windows`)[^3]。 --- #### **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值