8 คะแนน โดย GN⁺ 2024-07-01 | 7 ความคิดเห็น | แชร์ทาง WhatsApp
  • สรุปผลจากการค้นหาและเปรียบเทียบไลบรารีสำหรับเขียน 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 ความคิดเห็น

 
tsboard 2024-07-05

hikogui น่ากลัวจริง ๆ เลย ตื่นเต้นมาก

 
fastkoder 2024-07-03

การเขียนแอป GUI สำหรับ Windows เป็นเรื่องทรมาน

https://getstream.io/blog/flutter-desktop-vs-electron/ เปรียบเทียบประสิทธิภาพด้วยตัวชี้วัดที่หลากหลาย

 
fastkoder 2024-07-03

ถ้าเทียบกับ Sciter และ Electron ก็ถือว่า Flutter Windows Desktop Build เป็นตัวเลือกที่น่าพิจารณาเช่นกัน แม้บางครั้งจะมีปลั๊กอินที่มีบั๊กอยู่บ้าง แต่พื้นฐานทำมาได้ดี จึงสามารถนำไปใช้เป็นตัวกลางในการส่งต่อได้ ซิงเกิลตันอินสแตนซ์, อัปเดตอัตโนมัติ, สถานะบาร์, การแจ้งเตือนของ Windows, เวลาเปิดตัวที่รวดเร็ว, ภาษา Dart, Win32API Plugin เป็นต้น

 
soone 2024-07-03

Delphi

 
soone 2024-07-03

C++ Builder

 
joyfui 2024-07-02

"ต้องมีปริญญาเอกด้านวิทยาการคอมพิวเตอร์ถึงจะคอมไพล์สำเร็จ"
555

 
GN⁺ 2024-07-01
ความคิดเห็นจาก Hacker News
  • หลังจากอ่านคอมเมนต์จำนวนมาก ก็ได้ตระหนักว่าสมมติฐานตั้งต้นทั้งหมดผิดไป ควรเปลี่ยนชื่อบล็อกโพสต์เป็น "การเขียนแอป GUI สำหรับ Windows นั้นทรมาน เมื่อข้อกำหนดไม่สมจริง"
  • น่าจะดีกว่าถ้าใช้ .NET Framework 3.5 และพุ่งเป้าไปที่ WinForms ซึ่งติดตั้งอยู่แล้วใน Windows เวอร์ชันสมัยใหม่ทั้งหมด
  • บทความนี้ให้ภาพรวมที่ดีของตัวเลือกหลายแบบ แต่ข้อกำหนดเฉพาะของผู้เขียนทำให้หลายตัวเลือกถูกตัดออก
    • ข้อกำหนดที่ต้องการสไตล์ GUI แบบปรับแต่งได้ทั้งหมด แต่ไม่อยากเขียนฟังก์ชันเรนเดอร์เอง ทำให้โจทย์กลายเป็นการเลือกไลบรารี GUI ที่ปรับแต่งได้ง่าย
    • ข้อกำหนดเรื่องไฟล์ปฏิบัติการแบบ self-contained และขนาดต้องต่ำกว่า 40MB ก็ตัดตัวเลือกออกไปจำนวนมาก Qt สามารถตอบโจทย์นี้ได้ แต่ไลเซนส์โอเพนซอร์สไม่ตรงกับเป้าหมาย และผู้เขียนไม่อยากซื้อไลเซนส์
    • ถ้ายอมรับ dependency ภายนอกได้ หรือยอมรับขนาดดาวน์โหลดที่ใหญ่ขึ้นได้ หรือใช้คอนโทรล GUI ของ Windows ที่มีมาในระบบ สถานการณ์ก็จะต่างออกไปมาก
    • หากต้องการ GUI แบบปรับแต่งได้ทั้งหมดที่เบา ไม่มี dependency ภายนอก และต้องการไลเซนส์แบบอนุญาตกว้าง คาดว่า ImGui น่าจะเป็นคำตอบ
  • มีการชี้ว่าแนวคิด WinForms/WPF ไม่ได้มีข้อบกพร่องใหญ่โตอะไร แต่กลับไม่ได้อธิบายอะไรมากไปกว่าการต้องใช้สองสแตก ต้องการ native code และไม่อยากเห็น C# แต่ไม่ได้อธิบายเหตุผล อาจเป็นเพราะกลัวการ reverse engineering ก็ได้ โค้ด UI แทบไม่ค่อยมีความลับสำคัญ
    • การแจกจ่ายแบบ exe เดียวบางครั้งก็สะดวก แต่ในสถานการณ์นี้อาจกลายเป็นภาระ การใช้แพ็กเกอร์อย่าง Velopack (Squirrel) ทำให้แจกจ่ายเป็น exe เดียวได้ และยังเพิ่มความสามารถอัปเดตอัตโนมัติด้วย การมีไฟล์มากกว่าหนึ่งไฟล์บนดิสก์ตอนติดตั้งเป็นการประนีประนอมที่ดี
    • Windows เป็นแพลตฟอร์มที่แย่ที่สุดสำหรับการพัฒนาแอปเดสก์ท็อป เมื่อเทียบกับทุกแพลตฟอร์มอื่น
  • มีความเห็นในแง่ลบอย่างมากต่อผู้พัฒนาที่บ่นว่าต้องจ่ายค่าไลเซนส์เชิงพาณิชย์ให้กับไลบรารีซอฟต์แวร์ที่ใช้ไลเซนส์ LGPL พวกเขาคาดหวังว่าจะได้รับค่าตอบแทนจากงานของตนเอง และรับประกันสิ่งนั้นด้วยการสร้างซอฟต์แวร์ปิดซอร์ส แต่กลับคาดหวังว่านักพัฒนาที่แก้ส่วนยากจริง ๆ ของการสร้างไลบรารี UI จะต้องเป็นผู้ใหญ่ใจดีที่มอบโค้ดให้โลกฟรี ๆ
  • เรื่อง Sciter และปัญหา "anti-aliasing"... ผู้เขียนไม่ได้เปิดใช้การรองรับ DPI ความละเอียดสูงในแอปพลิเคชัน
    • แก้ได้โดยเปิดใช้ใน Visual Studio หรือใส่ manifest ที่เหมาะสม
    • มีอธิบายไว้ในบทสอน "Hello C++"
  • ให้แม่นยำกว่านี้:
    • "portable" (exe เดียวโดยไม่แตกไฟล์อัตโนมัติ)
    • เป็นซอฟต์แวร์เชิงพาณิชย์และไม่ต้องการแจกจ่าย object file ที่คอมไพล์แล้วซ้ำ (ซึ่งเมื่อรวมกับข้อกำหนด "portable" ก็ทำให้ใช้ LGPL ไม่ได้)
    • dark mode
    • แอป GUI บน Windows นั้นทรมาน ถ้าตัดข้อกำหนดข้อใดข้อหนึ่งออก จะมีตัวเลือกดี ๆ มากมาย
    • แอปพลิเคชัน "portable" ส่วนใหญ่ใช้ win32 โดยทั่วไปแล้วแอป portable มักเป็นแอปขนาดเล็กและเรียบง่าย ซึ่งฟังก์ชันการใช้งานสำคัญกว่าความสามารถด้าน dark mode หรือการปรับสไตล์อื่น ๆ
  • ในฐานะคนที่เรียกร้องจากโอเพนซอร์สของคนอื่นมากมาย ผู้เขียนกลับไม่คิดจะเปิดซอร์สโซลูชันของตัวเอง
  • ฉันกำลังทำ GUI toolkit ที่ตรงกับข้อกำหนดนี้อยู่: Slint - https://slint.dev
    • สามารถคอมไพล์แบบ static เป็นไฟล์ .exe เดียวได้ และขนาดต่ำกว่า 40MB มีไลเซนส์ที่ใช้งานบนเดสก์ท็อปได้ฟรี มีทั้งสไตล์มืด/สว่าง และยังมีตัวแก้ไขแบบ drag and drop WYSIWYG (ที่กำลังพัฒนา)
  • การที่ต้องเขียนฟังก์ชัน custom paint สำหรับทุกคอนโทรล แสดงให้เห็นว่าปรัชญา win32 แบบเก่าไม่เหมาะกับผู้เขียน องค์ประกอบหลักของ win32 คือ wndproc คอนโทรลส่วนใหญ่จะถามสีจาก parent
    • ถ้ารู้สึกไม่สะดวก การห่อด้วยไลบรารีขนาดเล็กเพื่อตัด boilerplate ก็ไม่ใช่ปัญหาใหญ่
  • ผลลัพธ์ควรเป็นไฟล์ .exe เดียวที่ไม่มี dependency หรือมี dependency น้อยที่สุด และมีขนาดต่ำกว่า 40MB
    • ตอนนี้คอมพิวเตอร์มีเบราว์เซอร์สมัยใหม่กันแล้ว แทนที่จะเป็นไฟล์ .exe ก็อาจใช้ไฟล์ .html เดียวที่อินไลน์รูปภาพ/css/javascript ไว้ข้างในได้