Visual C++下創(chuàng)建WPF項(xiàng)目的方法探索

C++/CLI下創(chuàng)建WPF項(xiàng)目的方法

由于WPF不僅僅支持C#/VB開發(fā)章贞,還支持其他語(yǔ)言祥绞,比如: C++、F#等開發(fā),于是大白我最近花了點(diǎn)時(shí)間摸索了一下蜕径,本文主要介紹C++/CLI下創(chuàng)建WPF項(xiàng)目的方法两踏。

我使用的開發(fā)環(huán)境是: Win10 x64 + Visual Studio 2019 (16.6.1版本)。

今天我們需要使用C++/CLI兜喻,算是C++的一個(gè)子集吧梦染。

要能正常使用C++/CLI,首先需要確保你安裝了C++/CLI build套件(見下圖)虹统,同時(shí)還需要確保你安裝好了Visual C++相應(yīng)版本的運(yùn)行庫(kù)弓坞。

進(jìn)入控制面板,找到 Visual Studio 2019车荔,右擊"修改",然后切換到"獨(dú)立組件"(Individual components)這個(gè)選項(xiàng)卡戚扳。

img1

如果沒安裝忧便,勾選后安裝一下即可。

接下來我們可以創(chuàng)建項(xiàng)目了帽借,建議選用模板 CLR Empty Project (.NET Framework)珠增,解決方案和項(xiàng)目名可以都用CppWpfDemo

img2

這時(shí)一個(gè)空項(xiàng)目就創(chuàng)建完成了砍艾。

此時(shí)查看 Project的屬性蒂教,Configration Properties -> "C/C++" -> "All Options",輸入 "common"進(jìn)行搜索脆荷,確保選中的是 Common Language Runtime Suppor(/clr).

img3

接下來我們鼠標(biāo)右擊項(xiàng)目下的文件夾"Resource Files"凝垛,點(diǎn)"Add" -> "new item",類型選"Component Class"蜓谋,可使用默認(rèn)的名字MyComponent梦皮。

img4

此時(shí),MyComponent.cpp中的代碼如下:

#include "MyComponent.h"

為了正確引用到 WPF 中的各種庫(kù)桃焕,我們還需要加入 WPF中 3 個(gè)核心的 dll剑肯,操作方法是:

右鍵點(diǎn)擊項(xiàng)目中的 References,然后點(diǎn) Add Reference观堂,勾選上:

  • PresentationCore
  • PresentationFramework
  • WindowsBase
img5

接下來让网,進(jìn)行了一番倒騰,我改成了這個(gè)师痕,做成了一個(gè)簡(jiǎn)單的界面:

此時(shí) MyComponent.cpp的內(nèi)容如下:

#include "MyComponent.h"

using namespace CppWpfDemo;
using namespace System::Windows;
using namespace System::Windows::Controls;
using namespace System::Windows::Media;

[System::STAThreadAttribute]
int main(array<System::String^>^ args)
{
    Application^ app = gcnew Application();
    Window^ window = gcnew Window();
    window->Title = "C++/CLI WPF demo";

    TextBlock^ tb = gcnew TextBlock();
    tb->Text = "Hello WPF";

    // Add root Grid
    Grid^ rootGrid = gcnew Grid();
    rootGrid->Width = 120;
    rootGrid->Height = 120;
    RowDefinition^ myRowDef1 = gcnew RowDefinition();
    rootGrid->RowDefinitions->Add(myRowDef1);

    DataGrid^ grid = gcnew DataGrid();
    grid->Background = Brushes::LightBlue;
    grid->Width = 80;
    grid->Height = 100;

    // Define the Canvas
    Canvas^ mainCanvas = gcnew Canvas();
    mainCanvas->Children->Add(tb);
    mainCanvas->Children->Add(grid);

    Canvas::SetTop(tb, 20);
    Canvas::SetLeft(tb, 20);

    Canvas::SetTop(grid, 50);
    Canvas::SetLeft(grid, 20);

    rootGrid->Children->Add(mainCanvas);
    Grid::SetRow(mainCanvas, 0);

    window->Content = rootGrid;
    app->Run(window);

    return 0;
}

代碼中的[STAThread]是需要的溃睹,等價(jià)于[System::STAThread][System::STAThreadAttribute].

還有個(gè)朋友說需要在項(xiàng)目屬性中設(shè)置"Entry Point"的值為"main",測(cè)試過了填與不填沒影響七兜,建議別填丸凭。

image6

接下來,可以build了。

如果出現(xiàn)VCRUNTIME140.dll missing的問題惜犀,安裝一下Visual C++ Redistributable for Visual Studio 2015Microsoft Visual C++ 2015 Redistributable Update 3 RC 可以解決铛碑,x64和x86的運(yùn)行庫(kù)都需要安裝。

如果還不行虽界,

  • 下載 VCRUNTIME140.DLL
  • 以管理員權(quán)限復(fù)制這個(gè) dll 到 C:\Windows\System32
  • 檢查該 dll 的文件讀寫權(quán)限是否為只讀汽烦,如果是只讀,去掉前面的勾勾.

此時(shí)按F5(或 Ctrl + F5)莉御,運(yùn)行結(jié)果如下:

image9

美中不足的是后面一直有個(gè)命令行窗口撇吞。

網(wǎng)上找了下解決方案,發(fā)現(xiàn)將目前用的 int main()改為int WINAPI WinMain() 可以解決礁叔,要能使用WinMain()則需要引入windows.h頭文件牍颈。

當(dāng)把 #include windows.h加到#include "MyComponent.h"下一行時(shí),發(fā)現(xiàn)如下錯(cuò)誤:

image7

原因在于命令空間沖突琅关,使得Window的引用出現(xiàn)起義煮岁。

解決方法是: 將 #include windows.h放在代碼的第一行。

此時(shí)涣易,此時(shí) MyComponent.cpp的內(nèi)容如下:

#include "windows.h"
#include "MyComponent.h"

using namespace System::Windows;
using namespace System::Windows::Controls;
using namespace System::Windows::Media;

[STAThread]
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmd, int nCmd)
{
    Application^ app = gcnew Application();
    Window^ window = gcnew Window();
    window->Title = "C++/CLI WPF demo";

    TextBlock^ tb = gcnew TextBlock();
    tb->Text = "Hello WPF";

    // Add root Grid
    Grid^ rootGrid = gcnew Grid();
    rootGrid->Width = 120;
    rootGrid->Height = 120;
    RowDefinition^ myRowDef1 = gcnew RowDefinition();
    rootGrid->RowDefinitions->Add(myRowDef1);

    DataGrid^ grid = gcnew DataGrid();
    grid->Background = Brushes::LightBlue;
    grid->Width = 80;
    grid->Height = 100;

    // Define the Canvas
    Canvas^ mainCanvas = gcnew Canvas();
    mainCanvas->Children->Add(tb);
    mainCanvas->Children->Add(grid);

    Canvas::SetTop(tb, 20);
    Canvas::SetLeft(tb, 20);

    Canvas::SetTop(grid, 50);
    Canvas::SetLeft(grid, 20);

    rootGrid->Children->Add(mainCanvas);
    Grid::SetRow(mainCanvas, 0);

    window->Content = rootGrid;
    app->Run(window);

    return 0;
}

而運(yùn)行結(jié)果為:

image8

大白今天躺坑完畢画机,總算解決了問題,先醬~

第一個(gè)版本代碼已上傳到 github: https://github.com/yanglr/CppWpfDemo/tree/master/CppWpfDemo/CppWpfDemo.

改天接著聊新症,歡迎來評(píng)論區(qū)留言互動(dòng)哈~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末步氏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子徒爹,更是在濱河造成了極大的恐慌荚醒,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瀑焦,死亡現(xiàn)場(chǎng)離奇詭異腌且,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)榛瓮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門铺董,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人禀晓,你說我怎么就攤上這事精续。” “怎么了粹懒?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵重付,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我凫乖,道長(zhǎng)确垫,這世上最難降的妖魔是什么弓颈? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮删掀,結(jié)果婚禮上翔冀,老公的妹妹穿的比我還像新娘。我一直安慰自己披泪,他們只是感情好纤子,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著款票,像睡著了一般控硼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艾少,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天卡乾,我揣著相機(jī)與錄音,去河邊找鬼姆钉。 笑死说订,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的潮瓶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼钙姊,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼毯辅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起煞额,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤思恐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后膊毁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胀莹,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年婚温,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了描焰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栅螟,死狀恐怖荆秦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情力图,我是刑警寧澤步绸,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站吃媒,受9級(jí)特大地震影響瓤介,放射性物質(zhì)發(fā)生泄漏吕喘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一刑桑、第九天 我趴在偏房一處隱蔽的房頂上張望氯质。 院中可真熱鬧,春花似錦漾月、人聲如沸病梢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜓陌。三九已至,卻和暖如春吩蔑,著一層夾襖步出監(jiān)牢的瞬間钮热,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工烛芬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留隧期,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓赘娄,卻偏偏與公主長(zhǎng)得像仆潮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子遣臼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353