• C++开发WPF,Step by Step


    示例代码

    使用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来开发一个完整的软件了

  • 相关阅读:
    java多线程练习题 类
    java练习题在一个文件里面输入内容在另一个文件里面可以查看
    java练习题输入流姓名学号信息
    java 异常处理2
    java 处理异常练习题
    java get银行练习题
    java 练习题 求梯形的面积和周长
    java get正确写类的练习题 猫
    GUID 全局唯一标识符
    oracle 建表 练习2
  • 原文地址:https://www.cnblogs.com/skyofbitbit/p/3702857.html
Copyright © 2020-2023  润新知