首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 代碼實現 WPF ControlTemplate:FrameworkElementFactory 深度解析與數據類型遺留問題

     編輯:C++ 入門

核心釐清:C++/CLI 而非標準 C++

文中代碼使用 FrameworkElementFactory、BitmapImage、Uri、SetValue 等類型,屬 C++/CLI (Managed C++) 針對 WPF (Windows Presentation Foundation) 的編程模型,**非標準 ISO C++**。標準 C++ 無 GUI 框架,WPF 為 .NET 技術棧。

ControlTemplate 代碼構建邏輯

// 1. 創建圖片元素工廠
FrameworkElementFactory^ fe = gcnew FrameworkElementFactory(Image::typeid, "Image");
BitmapImage^ bi = gcnew BitmapImage();
bi->BeginInit();
bi->UriSource = gcnew Uri(@"E:\ChartControl\HanYang\ChartControl\Image\MainBackground.jpg");
bi->EndInit();
fe->SetValue(Image::SourceProperty, bi);

// 2. 創建文本框元素工廠
FrameworkElementFactory^ fe2 = gcnew FrameworkElementFactory(TextBox::typeid, "TextBox");
fe2->SetValue(TextBox::WidthProperty, 100.0);
fe2->SetValue(TextBox::HeightProperty, 100.0);

// 3. 用 Grid 容器封裝組合
FrameworkElementFactory^ f = gcnew FrameworkElementFactory(Grid::typeid, "Grid");
f->AppendChild(fe);
f->AppendChild(fe2);

// 4. 應用到 ControlTemplate
ControlTemplate^ tmpl = gcnew ControlTemplate();
tmpl->VisualTree = f;
targetControl->Template = tmpl;

關鍵點:FrameworkElementFactory 是**模板構建工廠**,非實際視覺樹節點。運行時 WPF 根據模板實例化真實元素。AppendChild 構建邏輯樹結構,SetValue 綁定依賴屬性。

C++ 數據類型遺留問題:int vs long

文中提到:32 位環境下 int 與 long 均為 4 字節,為何保留兩類型?

  • 歷史遺留:16 位時代 int=2B、long=4B
  • 標準保證:sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)
  • 跨平台可移植性:64 位 Linux/Unix 常為 long=8B(LP64),Windows 為 long=4B(LLP64)
  • 現代最佳實踐:使用 <cstdint> 固定寬度類型(int32_t、int64_t、uintptr_t),避免假設具體大小

浮點與整數類型陷阱

  • 僅 float/double 為浮點類型,其餘皆整數
  • 整數賦值浮點數會**截斷小數部分**(非四捨五入):int x = 3.75; // x==3
  • 混合類型運算隱式轉換:short result; long a=200, b=200; result = a * b; // 40000 → 截斷為 -25536 (溢出繞接)
  • 無符號繞接行為:unsigned short 最大 65535,+1 變 0

C++ 複雜性辯護:為何不應因噎廢食

文中引用觀點:「為避開 C++ 複雜性而不用 C++,無異於因噎廢食」。在所有可用 C/C++ 領域,C++ 具備:

  • 更安全的類型檢查
  • 更好的抽象機制(模板、RAII、概念)
  • 更優秀的庫(STL、Boost、現代框架)

例外場景:項目極小、無抽象需求、無基礎庫依賴 → 純 C 可行。

避開複雜性的工程策略:避短揚長

  1. 確立主風格:如「Better C + ADT + GP」,拒絕大雜燴 OO
  2. 局部封裝高級特性:模板元編程、SFINAE、Concepts 封裝於庫層,業務層見簡潔接口
  3. 依賴成熟庫:STL、Boost、{fmt}、spdlog、nlohmann/json 等,而非自造
  4. 編譯器輔助:-Wall -Wextra -Werror、Clang-Tidy、CppCoreGuidelines 檢查

結語

文中混合了 WPF/C++/CLI 模板構建、**C++ 基礎類型遺留問題**、**複雜性哲學辯論** 三個不同層面話題。開發者應:明確技術棧邊界(標準 C++ vs C++/CLI vs C#)、使用固定寬度類型消除移植性假設、採用「主風格統一 + 庫封裝複雜性」工程策略駕馭 C++。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved