최근 수정 시각 : 2025-01-28 18:34:44

wxWidgets

wxWidgets
파일:wxWidgets_logo.svg
저작자 Julian Smart
개발자 커뮤니티
초기 릴리즈 1992년
현재 버전 3.2.6 (stable), 3.3.0 (dev)
언어 C++11
OS 크로스플랫폼
라이선스 wxWindows Library Licence[1]
홈페이지 https://www.wxwidgets.org

1. 개요2. 특징
2.1. 네이티브 UI2.2. 크로스플랫폼
2.2.1. 백엔드2.2.2. 컴파일러 지원
2.3. 기타2.4. Hello, World!
3. wxWidgets를 사용하는 프로그램

[clearfix]

1. 개요

wxWidgets는 Julian Smart가 만든 C++ 위젯 툴킷이다. 마이크로소프트사의 MFC 대체 라이브러리로서 출시되었으며 오래된 MFC와는 달리 크로스 플랫폼을 지원한다.

2. 특징

2.1. 네이티브 UI

파일:wxWidgets-NativeControlExample.png
좌측부터 각기 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로서 관리되는 백엔드는 다음과 같다.
Tier 1이 아닌 백엔드는 다음과 같다.
  • wxMotif

    • Motif를 백엔드로 이용한다. Motif를 GUI라이브러리로 사용하는 플랫폼에서 사용할 수 있다.
  • wxQt

    • Qt를 백엔드로 이용한다. Qt를 이용할 수 있는 플랫폼에서 사용할 수 있다.
  • wxUniv/wxX11

    • 위의 밴엔드들이 타 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에서는 위와 같은 것으로 띄울 수 있다.
==# 타 언어로의 바인딩 #==

3. wxWidgets를 사용하는 프로그램


[1] LGPL보다 허용적인 라이선스로 MIT, 아파치등의 라이선스와 유사하다고 할 수 있다.[2] 언리얼 엔진 1, 2는 비주얼 베이직, C++, 언리얼 엔진 4, 5는 언리얼 엔진의 개발사 에픽 게임즈에서 자체 개발한 Slate를 사용한다.