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)卡戚扳。
如果沒安裝忧便,勾選后安裝一下即可。
接下來我們可以創(chuàng)建項(xiàng)目了帽借,建議選用模板 CLR Empty Project (.NET Framework)
珠增,解決方案和項(xiàng)目名可以都用CppWpfDemo
。
這時(shí)一個(gè)空項(xiàng)目就創(chuàng)建完成了砍艾。
此時(shí)查看 Project的屬性蒂教,Configration Properties
-> "C/C++" -> "All Options",輸入 "common"進(jìn)行搜索脆荷,確保選中的是 Common Language Runtime Suppor(/clr)
.
接下來我們鼠標(biāo)右擊項(xiàng)目下的文件夾"Resource Files"凝垛,點(diǎn)"Add" -> "new item",類型選"Component Class"蜓谋,可使用默認(rèn)的名字MyComponent
梦皮。
此時(shí),MyComponent.cpp
中的代碼如下:
#include "MyComponent.h"
為了正確引用到 WPF 中的各種庫(kù)桃焕,我們還需要加入 WPF中 3 個(gè)核心的 dll剑肯,操作方法是:
右鍵點(diǎn)擊項(xiàng)目中的 References
,然后點(diǎn) Add Reference
观堂,勾選上:
- PresentationCore
- PresentationFramework
- WindowsBase
接下來让网,進(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è)試過了填與不填沒影響七兜,建議別填丸凭。
接下來,可以build了。
如果出現(xiàn)VCRUNTIME140.dll missing
的問題惜犀,安裝一下Visual C++ Redistributable for Visual Studio 2015 和 Microsoft 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é)果如下:
美中不足的是后面一直有個(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ò)誤:
原因在于命令空間沖突琅关,使得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é)果為:
大白今天躺坑完畢画机,總算解決了問題,先醬~
第一個(gè)版本代碼已上傳到 github
: https://github.com/yanglr/CppWpfDemo/tree/master/CppWpfDemo/CppWpfDemo.
改天接著聊新症,歡迎來評(píng)論區(qū)留言互動(dòng)哈~