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,?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.???????? 修改工程屬性,在工程屬性的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(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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/386267.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/386267.shtml
英文地址,請注明出處:http://en.pswp.cn/news/386267.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#學習之unsafe

為了保持類型安 全,默認情況下,C# 不支持指針算法。 不過,通過使用 unsafe 關鍵字,可以定義可使用指針的不安全上下文。 unsafe 在C# 程 序中的使用場合: 1)實時應用,采用指針來提高性能&…

百度、華為、京東、B站最新面試題匯集,實戰篇

前言 回顧一下自己這段時間的經歷,因公司突然通知裁員,我匆匆忙忙地出去面了幾家,但最終都沒有拿到offer,我感覺今年的寒冬有點冷。公司開始第二波裁員,我決定主動拿賠償走人。后續的面試過程我做了一些準備&#xff…

php 常用正則運算

$regx "/^[0-9]*$/"; var_dump(preg_match($regx, $phone));常用的正則運算: ?驗證數字:^[0-9]*$ ?驗證n位的數字:^\d{n}$ ?驗證至少n位數字:^\d{n,}$ ?驗證m-n位的數字:^\d{m,n}$ ?驗證零和非零開頭的…

百度、阿里、滴滴、新浪的面試心經總結,一線互聯網公司面經總結

開頭 技術的發展產生了程序員這個職位,從這些年各大互聯網公司曝光的一些員工收入水平來看,程序員的工資還是相對比較高的,可是我們在互聯網上還聽到了另外一種聲音,很多程序員想轉行,特別是大齡程序員,這…

go build編譯不同環境

#usage: go build [-o output] [-i] [build flags] [packages] go build的使用比較簡潔,所有的參數都可以忽略,直到只有go build,這個時候意味著使用當前目錄進行編譯,下面的幾條命令是等價的: go buildgo build .go b…

百度、阿里、滴滴、新浪的面試心經總結,源碼+原理+手寫框架

前言 作為一個程序員,如果你在新知識、新技術面前仍一無所知,依然吃著十多年前的老本,那你在知識技術上肯定落伍,如果又未能進入管理層面,那你肯定就會被長江的后浪拍在沙灘上了。 而不少與時俱進、善于學習的程序員…

LINQ to SQL

Moved to http://blog.tangcs.com/2008/10/06/linq-to-sql/轉載于:https://www.cnblogs.com/WarrenTang/archive/2008/10/06/1304727.html

目前最全的《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,聰明人已經收藏了!

開頭 讓我們一起來看看,字節跳動的第三面,面試官都問了什么?(第一二面的題目及答案已整理,需要的可以在文末領取) 從七月中旬開始,我前前后后差不多一共投遞了八十份簡歷,到目前為…

程序從高版本降到2.0,數據集報錯 TypedTableBase

錯誤 命名空間“System.Data”中不存在類型或命名空間名稱“TypedTableBase”(是缺少程序集引用嗎?) 解決&#xff1a; 該錯誤出現在自動生成的XXX.Designer.cs里。 .NET 3.5 : public partial class T_OPERATOR_WLDataTable : global::System.Data.TypedTableBase<T_OPER…

從外包月薪5K到阿里月薪15K,原理+實戰+視頻+源碼

前言 轉眼間&#xff0c;2020 年已過去一大半了&#xff0c;2020 年很難&#xff0c;各企業裁員的消息蠻多的&#xff0c;降職&#xff0c;不發年終獎等等。2020 年確實是艱難的一年。然而生活總是要繼續&#xff0c;時間不給你喪的機會&#xff01;如果我們能堅持下來&#x…

C#編寫的發送手機短信的類庫 C#開發短信的方法和簡介 短信編程實例

發送手機短信源代碼(針對國內短信編碼) / ///文 件&#xff1a;PDUdecoding.cs ///概 要&#xff1a;針對國內短信編碼&#xff08;USC2&#xff09; ///組成結構&#xff1a;包含四個函數&#xff1a; /// smsDecodedCenterNumber(string srvCenterNumber) …

從新手到Flutter架構師,一篇就夠!吐血整理

在開始回答前&#xff0c;先簡單概括性地說說Linux現有的所有進程間IPC方式&#xff1a; 1. **管道&#xff1a;**在創建時分配一個page大小的內存&#xff0c;緩存區大小比較有限&#xff1b; 2. 消息隊列&#xff1a;信息復制兩次&#xff0c;額外的CPU消耗&#xff1b;不合…

小程序自定義組件中observer函數的應用

<!-- 單個數據監聽 --> <view>白菜</view> <view>價格&#xff1a;{{price}}</view> <!-- bindinput輸入時觸發方法 --> <view>數量&#xff1a; <input type"number" bindinputchangee value"{{num1}}">…