wxWidgets | |
저작자 | Julian Smart |
개발자 | 커뮤니티 |
초기 릴리즈 | 1992년 |
현재 버전 | 3.2.6 (stable), 3.3.0 (dev) |
언어 | C++11 |
OS | 크로스플랫폼 |
라이선스 | wxWindows Library Licence[1] |
홈페이지 | https://www.wxwidgets.org |
[clearfix]
1. 개요
wxWidgets는 Julian Smart가 만든 C++ 위젯 툴킷이다. 마이크로소프트사의 MFC 대체 라이브러리로서 출시되었으며 오래된 MFC와는 달리 크로스 플랫폼을 지원한다.2. 특징
2.1. 네이티브 UI
좌측부터 각기 Windows, GTK, macOS이며 같은 코드에서 각각 플랫폼의 네이티브 위젯을 표시하는 모습 |
모던한 크로스 플랫폼 UI 라이브러리의 경우 각각의 위젯을 별도의 렌더링 라이브러리로 그리지만 wxWidgets는 대체로 각 OS의 네이티브 UI 위젯을 그대로 이용한다.
자체적으로 렌더러를 사용하여 위젯을 그리지 않다 보니 네이티브 창에 직접 작업을 할수 있다. 가령 DirectX나 Vulkan의 경우 wxWidgets에서 캔버스를 지원하지 않아도 Windows의 경우 위젯의 윈도우
HANDLE
, GTK의 경우 gtk_widget
포인터, macOS/Cocoa 에서는 NSView
를 얻어서 스왑체인을 생성할 수 있다.OS의 네이티브 UI만으로 변환하여 사용하다보니 네이티브 UI를 벗어나는 인터페이스 디자인을 하기 어렵고 번거롭지만 wxWidgets의 추상화된 드로잉 API를 이용하여 직졉 위젯을 구현할 수 있다. wxWidgets가 제공하는 위젯 중 네이티브 위젯이 없는 경우 드로잉 API를 이용하거나 혹은 여러 네이티브 위젯을 조합하여 제너릭 버전을 제공한다. RibbonBar와 Grid, DataView가 대표적인 예시.
2.2. 크로스플랫폼
2.2.1. 백엔드
wxWidgets은 타 GUI 라이브러리/프레임워크의 상위 레이어로서 기능한다. wxWidgets는 타 GUI 라이브러리/프레임워크를 추상화하고 유틸리티 클래스를 제공하여 별도의 수정없이 크로스 플랫폼 프로그래밍을 지향한다.그 중 Tier 1로서 관리되는 백엔드는 다음과 같다.
- wxMSW
- wxGTK
- wxOSX/Cocoa
Windows API를 백엔드로 이용한다. 사용 가능한 플랫폼은 Windows이다.
Cocoa API를 백엔드로 이용한다. 사용 가능한 플랫폼은 macOS이다.
Tier 1이 아닌 백엔드는 다음과 같다.
- wxMotif
- wxQt
- wxUniv/wxX11
Motif를 백엔드로 이용한다. Motif를 GUI라이브러리로 사용하는 플랫폼에서 사용할 수 있다.
Qt를 백엔드로 이용한다. Qt를 이용할 수 있는 플랫폼에서 사용할 수 있다.
위의 밴엔드들이 타 GUI 라이브러리/프레임워크를 사용하는 것과 다르게 wxUniv는 각 플랫폼의 드로잉 API를 사용하여 직접 위젯을 그린다. 드로잉 API를 구현해주면 사용할 수 있다는 점을 활용하여 wxWidgets를 WebAssembly으로 포팅한 프로젝트도 존재한다. 프로젝트, 샘플
2.2.2. 컴파일러 지원
- MS Visual Studio 2015~
- Intel C/C++ (icc)
- Sun CC for Linux
- LLVM / Clang / Clang++
- GCC(MinGW, Cygwin 포함)
- BCC (C++ Builder)
- Watcom C++ Compiler
2.3. 기타
- Windows 에서의 HiDPI 지원
- XML 리소스 컴파일 (XRC) - wxSmith나 wxFormbuilder를 사용하여 WYSIWYG로 개발을 하지 않는 이상 기본적으로 wxWidgets은 날코딩으로 UI를 짜는것이 일반적이다. 그렇지만 위의 WYSIWYG 툴을 사용하여 개발을 하여도 프로그램의 루틴과 wxWidgets의 루틴이 섞이게 되는것은 피할 수 없는 일이기에 XML로 짜거나 wxFormbuilder같은 WYSIWYG툴을 사용하여 XML로 UI를 제작하는 경우 UI의 코드와 프로그램의 백엔드를 완벽하게 분리해 둘 수 있게 된다.
- wxWidgets를 실제로 사용할 경우 매크로 선언 및 헤더 폴더 및 라이브러리 폴더 추가, 라이브러리 링킹 등의 잡다한 선행 작업들이 많고 메인테이너들 또한 인지하고 있어 선행 작업들을 간략화하기 위한 여러 방법들을 제공한다.
- Linux/Unix 환경에서 wxWidgets를 설치 혹은 빌드할 경우 wxconfig이라는 스크립트 파일이 제공되며 매개인자로 사용하고자 하는 모듈을 넣어 실행시킬 경우 빌드에 필요한 문자열이 나온다.
- CMake를 사용하는 경우 find_package를 이용하여 wxWidgets의 헤더 파일 및 라이브러리 파일 변수가 세팅할 수 있다.
- Visual Studio에서 사용하는 경우 CMake를 사용해도 되고 wxWidgets 폴더 안의 wxwidgets.props 파일을 프로젝트의 프로퍼티에 추가할 경우 선행 작업을 생략할 수 있다.
- wxWidgets의 각 모듈 및 클래스의 기능들의 예제를 보고 싶은 경우 wxWidgets 레포에 있는 examples안에 있는 예제들을 참조하면 된다.
2.4. Hello, World!
#!syntax cpp
#include <wx/wx.h>
class HelloWorldApp: public wxApp
{
public:
virtual bool OnInit() override
{
wxFrame* myFrame = new wxFrame(nullptr, wxID_ANY, wxT("Hello, world!"));
myFrame->Show();
return true;
}
};
wxIMPLEMENT_APP(HelloWorldApp);
코드 길이가 Windows API로 직접 짠 것보다 짧다. "Hello World" 이름으로 된 창만 띄우는 것만 하더라도 Windows API에서 최소 40줄 이상은 되지만 wxWidgets에서는 위와 같은 것으로 띄울 수 있다.
==# 타 언어로의 바인딩 #==
- Erlang
- Euphoria
- Haskell #
- JavaScript
- Lua
- Perl
- PHP
- Python 2K, 3K: Phoenix라는 프로젝트명으로 wxWidgets 제작팀에서 유지 보수 중이다.
- Ruby
- Rust: #
- Swift - #
3. wxWidgets를 사용하는 프로그램
- Audacity
- BitTorrent
- BOINC@HOME
- Code::Blocks
- CodeLite
- Corona Image Editor
- FileZilla
- KiCad
- PostgreSQL Stack builder
- PCSX2
- 언리얼 엔진 3의 언리얼 에디터, [2]
- Aegisub
- gnuplot
- PlayOnLinux
[1] LGPL보다 허용적인 라이선스로 MIT, 아파치등의 라이선스와 유사하다고 할수 있다.[2] 언리얼 엔진 1, 2는 비주얼 베이직, C++, 언리얼 엔진 4, 5는 언리얼 엔진의 개발사 에픽 게임즈에서 자체 개발한 Slate를 사용한다.