使用C++來開發WPF

來源:互聯網
上載者:User

使用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來開發一個完整的軟體了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.