컴퓨터 활용(한글, 오피스 등)/기타
윈도우용 GUI
3604
2025. 2. 18. 09:49
728x90
출처: https://news.hada.io/topic?id=15626
GN⁺: 윈도우용 GUI앱을 작성하는 것은 괴롭습니다
(tulach.cc)- C++에서 GUI 작성용 라이브러리를 검색하고 비교한 결과 정리
- 기본 요구사항 : 윈도우 지원만 필요, 상업적 사용 가능, 다크모드 포함 쉬운 스타일링, 최소 종속성의 40MB 미만 단일 EXE 생성, 빠른 개발
WinUI 3
- 처음에는 훌륭한 선택처럼 보임
- 현대적인 Windows 구성 요소를 사용할 수 있고 스타일 색상을 사용자 정의할 수 있음
- XAML을 사용하여 디자인할 수 있고 Visual Studio 디자이너를 직접 사용할 수도 있음
- 문제:
- 패키징되지 않은 형태로 앱을 제공하는 것은 잘 지원되지 않음
- 앱을 VM이나 다른 컴퓨터로 이동할 때 대부분 실행에 실패함
- WinUI 기능을 처리하는 많은 .dll 파일을 제공해야 함
- 단일 포터블 .exe 파일을 만들 수 없음
- 패키지 형태로 사용 시 문제 없음, 하지만 AppX 패키지로 설치되어 Win32 API 접근 문제 발생
Win32 / MFC / Win32를 래핑하는 작은 라이브러리
- 높은 이식성이 필요하므로 OS의 기본 렌더링을 사용하는 것이 합리적임
- 프로그램은 단일 .exe 파일이 될 수 있고 크기도 매우 작을 수 있음(MFC 정적 링크 시)
- 누군가 이미 작성한 보다 최소한의 라이브러리를 사용할 수 있음
- 문제:
- 기본 Win32 컨트롤을 스타일화하는 것은 매우 어려움
- 모든 컨트롤에 대해 사용자 정의 페인트 기능을 작성해야 함
- 윈도우 파일 탐색기에서 사용되는 "숨겨진" 다크 모드가 있지만 일부 컨트롤만 포함하고 여전히 잘 보이지 않음
Qt
- C++ GUI의 성배
- 복잡하지만 Qt Style Sheets를 사용하여 쉽게 스타일을 지정할 수 있음
- 문제:
- 동적으로 연결할 때 앱을 실행하는 데 필요한 수많은 .dll이 있으며 크기가 40MB 이상임
- Qt를 프로그램에 정적으로 연결할 수 있지만 오픈 소스로 만들거나 Qt의 LGPL 라이선스로 인해 재컴파일할 오브젝트 파일을 배포해야 함
- 또는 상용 라이선스를 구매할 수 있으나 수천 달러
wxWidgets
- 배우기 쉬운 라이브러리
- wxFormBuilder를 사용할 수 있음
- Qt보다 더 허용적인 라이선스를 가지고 있으며 3MB 실행 파일에 정적으로 연결될 수 있음
- 문제:
- Windows에서는 기본 Win32 구성 요소를 사용하며 스타일링 옵션을 제공하지 않음
- Windows 파일 탐색기 다크 컨트롤 적용을 지원하지만 별로 좋지 않음
hikogui
- Vulkan을 백엔드로 사용하는 새로운 retained mode GUI 라이브러리
- 내장 다크 모드가 있고 스타일을 쉽게 지정할 수 있음
- 문제:
- 성공적으로 컴파일하려면 컴퓨터 과학 박사 학위가 필요함
- 30분 이상 예제를 컴파일하려고 시도한 후 Vulkan 라이브러리 내부에서 액세스 위반으로 즉시 충돌하는 실행 파일만 얻었음
Sciter
- HTML/CSS를 사용하여 데스크톱 앱용 GUI를 작성할 수 있는 Electron의 좋은 대안
- 문제:
- 최종 앱이 모든 .dll과 함께 약 25MB 정도 되는 크기가 문제가 될 것 같지만 괜찮음
- 오픈 소스이고 상용으로 정적 링크 버전을 사용할 수 있다면 더 좋을 것임
- Qt처럼 비싸지 않아서 ($310) 돈을 내고 행복할 것임
- 문제는 렌더링이 그다지 좋지 않다는 것
- 글꼴과 이미지의 앨리어싱 문제가 있었음
- 창에는 사용자 정의하거나 수정할 수 없는 꽤 두꺼운(2-3px) 회색 프레임이 있음
WinForms / WPF
- C++ GUI 라이브러리에 대해 물어보면 대부분 다른 스택을 사용하라고 권장
- C++은 나쁜 생각이므로 프로그램의 프런트엔드를 다른 스택으로 작성하고 C++로 작성된 기능을 구성 요소/모듈로 로드하라고 말함
- 단일 .exe 파일을 작은 크기로 가질 수 있고 WinForms/WPF를 사용할 수 있음
- .dll을 앱에 리소스로 번들링하고 임시 폴더에 추출하도록 한 다음 P/Invoke를 사용하고 C#/.NET 앱 내에서 컴파일된 .dll을 호출하거나 C++/CLI를 사용하면 됨
- 문제:
- .NET 프레임워크는 Windows 10 이상에 사전 설치되어 있으므로 기술적으로 종속성 없음 기준을 충족함
-
- .dll을 번들링하면 어딘가에 추출되어야 하고 P/Invoke가 작동하기 위해 추가 코드를 작성해야 함
-
- C++/CLI는 .NET IL 코드로 컴파일되어 C#으로 번역된 C++ 코드가 보임
해결책?
- 간단한 앱의 경우 Dear ImGui보다 더 적합한 것은 없다고 생각함
- 복잡한 UI를 설계할 때 주로 단점이 있고, retained mode UI가 아니라 immediate mode UI이므로 UI를 위해 초당 60프레임 이상을 렌더링하기 위해 DirectX와 같은 GPU 렌더러를 실행해야 함
- 그러나 다른 모든 점에서는 일치함
- 컴파일된 프로그램은 크기가 500KB에 불과하며 VC++ 재배포 가능 파일을 설치할 필요가 없음
GN⁺의 의견
- 글쓴이가 말한 대로 GUI 앱 개발을 위한 완벽한 라이브러리는 없는 것 같음. 요구사항에 따라 trade-off가 있음
- 간단한 앱의 경우 Dear ImGui가 가장 적합해 보이지만, 복잡한 UI를 만들려면 retained mode GUI 툴킷을 사용하는 것이 더 나을 것임
- 상용 앱을 만들려면 라이선스 비용이 중요한 고려사항이 될 수 있음. Qt와 같은 라이브러리는 비용이 높지만 wxWidgets는 무료로 사용할 수 있음
- C++로 GUI 앱을 만드는 것은 쉽지 않은 일이므로, C#이나 다른 언어로 프론트엔드를 개발하고 C++로 성능 집약적인 부분만 구현하는 것이 더 현실적일 수 있음
- Windows에서 네이티브 look-and-feel을 원한다면 WinUI나 MFC를 사용하는 것이 좋겠지만, 크로스 플랫폼 지원이 필요하다면 Qt나 wxWidgets가 더 나은 선택이 될 수 있음
728x90