C++开发WPF,Step by Step
?
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???????? 添加創建窗口函數,函數如下:
{
????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::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來開發一個完整的軟件了
轉載于:https://www.cnblogs.com/sun9411323/archive/2007/12/04/981600.html
總結
以上是生活随笔為你收集整理的C++开发WPF,Step by Step的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LOL对线技巧
- 下一篇: C#学习之unsafe