- สรุปผลจากการค้นหาและเปรียบเทียบไลบรารีสำหรับเขียน GUI ใน C++
- ความต้องการพื้นฐาน: รองรับ Windows อย่างเดียวก็พอ, ใช้งานเชิงพาณิชย์ได้, ปรับสไตล์ได้ง่ายพร้อมรองรับดาร์กโหมด, สร้างไฟล์ EXE เดี่ยวขนาดไม่เกิน 40MB ที่มี dependency ต่ำที่สุด, พัฒนาได้รวดเร็ว
WinUI 3
- ตอนแรกดูเหมือนจะเป็นตัวเลือกที่ยอดเยี่ยม
- ใช้องค์ประกอบสมัยใหม่ของ Windows ได้ และปรับแต่งสีของสไตล์ได้
- ออกแบบด้วย XAML ได้ และยังใช้ดีไซเนอร์ของ Visual Studio ได้โดยตรง
- ปัญหา:
- การแจกจ่ายแอปในรูปแบบที่ไม่ต้องแพ็กเกจยังรองรับได้ไม่ดีนัก
- เมื่อนำแอปไปยัง VM หรือคอมพิวเตอร์เครื่องอื่น ส่วนใหญ่มักรันไม่สำเร็จ
- ต้องแจกไฟล์ .dll จำนวนมากที่ใช้รองรับความสามารถของ WinUI
- ไม่สามารถสร้างไฟล์ .exe แบบพกพาเพียงไฟล์เดียวได้
- หากใช้ในรูปแบบแพ็กเกจก็ไม่มีปัญหา แต่จะถูกติดตั้งเป็นแพ็กเกจ AppX ทำให้เกิดปัญหาในการเข้าถึง Win32 API
Win32 / MFC / ไลบรารีขนาดเล็กที่ครอบ Win32
- หากต้องการความพกพาสูง การใช้การเรนเดอร์พื้นฐานของ OS ก็ดูสมเหตุสมผล
- โปรแกรมสามารถเป็นไฟล์ .exe เดียวได้ และมีขนาดเล็กมากได้ด้วย (ถ้า static link กับ MFC)
- ยังสามารถใช้ไลบรารีที่เล็กและเรียบง่ายกว่านี้ซึ่งมีคนเขียนไว้แล้วได้
- ปัญหา:
- การปรับสไตล์คอนโทรลพื้นฐานของ Win32 ทำได้ยากมาก
- ต้องเขียนฟังก์ชันวาดเองสำหรับทุกคอนโทรล
- มีดาร์กโหมดแบบ "ซ่อนอยู่" ที่ใช้ใน Windows File Explorer แต่รองรับแค่บางคอนโทรลและก็ยังดูไม่ดีอยู่ดี
Qt
- เหมือนจอกศักดิ์สิทธิ์ของ GUI บน C++
- ซับซ้อน แต่ปรับสไตล์ได้ง่ายด้วย Qt Style Sheets
- ปัญหา:
- หากลิงก์แบบไดนามิก จะมี .dll จำนวนมากที่จำเป็นต่อการรันแอป และขนาดรวมเกิน 40MB
- สามารถลิงก์ Qt แบบสแตติกเข้ากับโปรแกรมได้ แต่ต้องทำโปรแกรมเป็นโอเพนซอร์ส หรือแจกไฟล์อ็อบเจ็กต์สำหรับการคอมไพล์ใหม่ตามเงื่อนไขไลเซนส์ LGPL ของ Qt
- หรือจะซื้อไลเซนส์เชิงพาณิชย์ก็ได้ แต่ราคาหลายพันดอลลาร์
wxWidgets
- เป็นไลบรารีที่เรียนรู้ง่าย
- ใช้ wxFormBuilder ได้
- มีไลเซนส์ที่ผ่อนปรนกว่า Qt และสามารถลิงก์แบบสแตติกจนได้ไฟล์รันเพียง 3MB
- ปัญหา:
- บน Windows มันใช้คอมโพเนนต์ Win32 พื้นฐาน และไม่มีตัวเลือกสำหรับการปรับสไตล์
- รองรับการใช้ดาร์กคอนโทรลแบบ Windows File Explorer แต่ผลลัพธ์ก็ไม่ได้ดีนัก
hikogui
- เป็นไลบรารี GUI แบบ retained mode รุ่นใหม่ที่ใช้ Vulkan เป็นแบ็กเอนด์
- มีดาร์กโหมดในตัวและปรับสไตล์ได้ง่าย
- ปัญหา:
- ต้องมีปริญญาเอกวิทยาการคอมพิวเตอร์ถึงจะคอมไพล์ผ่านได้สำเร็จ
- หลังจากพยายามคอมไพล์ตัวอย่างอยู่นานกว่า 30 นาที สิ่งที่ได้มีเพียงไฟล์รันที่แครชทันทีด้วย access violation ภายในไลบรารี Vulkan
Sciter
- เป็นทางเลือกที่ดีแทน Electron สำหรับการเขียน GUI ของแอปเดสก์ท็อปด้วย HTML/CSS
- ปัญหา:
- ขนาดแอปสุดท้ายที่ประมาณ 25MB พร้อม .dll ทั้งหมดอาจดูเป็นปัญหา แต่ก็ยังพอรับได้
- ถ้าเป็นโอเพนซอร์สและสามารถใช้เวอร์ชัน static link สำหรับงานเชิงพาณิชย์ได้ก็คงดีกว่านี้
- มันไม่ได้แพงเท่า Qt ($310) จึงยอมจ่ายอย่างสบายใจ
- ปัญหาคือคุณภาพการเรนเดอร์ไม่ค่อยดีนัก
- เจอปัญหา aliasing ของฟอนต์และรูปภาพ
- หน้าต่างมีกรอบสีเทาค่อนข้างหนา (2-3px) ที่ไม่สามารถปรับแต่งหรือแก้ไขได้
WinForms / WPF
- ถ้าถามถึงไลบรารี GUI สำหรับ C++ คนส่วนใหญ่มักแนะนำให้ใช้สแตกอื่นแทน
- พวกเขาบอกว่า C++ เป็นความคิดที่ไม่ดี จึงควรเขียนฟรอนต์เอนด์ของโปรแกรมด้วยสแตกอื่น แล้วโหลดความสามารถที่เขียนด้วย C++ เป็นคอมโพเนนต์/โมดูล
- สามารถมี .exe เดี่ยวขนาดเล็ก และใช้ WinForms/WPF ได้
- สามารถบันเดิล .dll ไว้เป็น resource ของแอป แล้วแตกออกไปยังโฟลเดอร์ชั่วคราว จากนั้นใช้ P/Invoke และเรียก .dll ที่คอมไพล์ไว้จากภายในแอป C#/.NET หรือใช้ C++/CLI ก็ได้
- ปัญหา:
- .NET Framework ถูกติดตั้งมาพร้อมกับ Windows 10 ขึ้นไปอยู่แล้ว จึงถือว่าในทางเทคนิคผ่านเงื่อนไขเรื่องไม่มี dependency เพิ่มเติม
-
- หากบันเดิล .dll ก็ยังต้องแตกไฟล์ออกไปที่ใดสักแห่ง และต้องเขียนโค้ดเพิ่มเพื่อให้ P/Invoke ทำงานได้
-
- C++/CLI จะคอมไพล์เป็นโค้ด .NET IL ทำให้เห็นโค้ด C++ ที่เหมือนถูกแปลเป็น C#
ทางออก?
- สำหรับแอปง่าย ๆ ดูเหมือนว่าจะไม่มีอะไรเหมาะไปกว่า Dear ImGui
- ข้อเสียหลักจะอยู่ตอนออกแบบ UI ที่ซับซ้อน และเพราะมันไม่ใช่ retained mode UI แต่เป็น immediate mode UI จึงต้องรันตัวเรนเดอร์ GPU อย่าง DirectX เพื่อเรนเดอร์ UI ที่ 60 เฟรมต่อวินาทีขึ้นไป
- แต่ในด้านอื่น ๆ มันตอบโจทย์ทั้งหมด
- โปรแกรมที่คอมไพล์แล้วมีขนาดเพียง 500KB และไม่ต้องติดตั้ง VC++ Redistributable
ความเห็นจาก GN⁺
- อย่างที่ผู้เขียนบอก ดูเหมือนว่าจะไม่มีไลบรารีที่สมบูรณ์แบบสำหรับการพัฒนาแอป GUI โดยมี trade-off ตามความต้องการ
- สำหรับแอปง่าย ๆ Dear ImGui ดูจะเหมาะที่สุด แต่ถ้าต้องทำ UI ที่ซับซ้อน การใช้ retained mode GUI toolkit น่าจะดีกว่า
- หากจะทำแอปเชิงพาณิชย์ ค่าไลเซนส์อาจเป็นปัจจัยสำคัญที่ต้องพิจารณา ไลบรารีอย่าง Qt มีต้นทุนสูง แต่ wxWidgets ใช้ได้ฟรี
- การสร้างแอป GUI ด้วย C++ ไม่ใช่เรื่องง่าย ดังนั้นการพัฒนาฟรอนต์เอนด์ด้วย C# หรือภาษาอื่น และให้ C++ รับหน้าที่เฉพาะส่วนที่ใช้ประสิทธิภาพสูง อาจเป็นแนวทางที่สมจริงกว่า
- หากต้องการ native look-and-feel บน Windows การใช้ WinUI หรือ MFC ก็น่าจะเหมาะ แต่ถ้าต้องการรองรับข้ามแพลตฟอร์ม Qt หรือ wxWidgets อาจเป็นตัวเลือกที่ดีกว่า
7 ความคิดเห็น
hikogui น่ากลัวจริง ๆ เลย ตื่นเต้นมาก
การเขียนแอป GUI สำหรับ Windows เป็นเรื่องทรมาน
https://getstream.io/blog/flutter-desktop-vs-electron/ เปรียบเทียบประสิทธิภาพด้วยตัวชี้วัดที่หลากหลาย
ถ้าเทียบกับ Sciter และ Electron ก็ถือว่า Flutter Windows Desktop Build เป็นตัวเลือกที่น่าพิจารณาเช่นกัน แม้บางครั้งจะมีปลั๊กอินที่มีบั๊กอยู่บ้าง แต่พื้นฐานทำมาได้ดี จึงสามารถนำไปใช้เป็นตัวกลางในการส่งต่อได้ ซิงเกิลตันอินสแตนซ์, อัปเดตอัตโนมัติ, สถานะบาร์, การแจ้งเตือนของ Windows, เวลาเปิดตัวที่รวดเร็ว, ภาษา Dart, Win32API Plugin เป็นต้น
Delphi
C++ Builder
"ต้องมีปริญญาเอกด้านวิทยาการคอมพิวเตอร์ถึงจะคอมไพล์สำเร็จ"
555
ความคิดเห็นจาก Hacker News