8 pontos por GN⁺ 2024-07-01 | 7 comentários | Compartilhar no WhatsApp
  • Resumo da pesquisa e comparação de bibliotecas para criar GUI em C++
  • Requisitos básicos: suporte apenas ao Windows, uso comercial permitido, modo escuro incluído com estilização fácil, geração de um único EXE com menos de 40 MB e mínimas dependências, desenvolvimento rápido

WinUI 3

  • No começo, pareceu uma excelente escolha
  • Permite usar componentes modernos do Windows e personalizar as cores do estilo
  • É possível projetar usando XAML e até usar diretamente o designer do Visual Studio
  • Problemas:
    • O suporte para distribuir o app sem empacotamento não é muito bom
    • Ao mover o app para uma VM ou outro computador, na maioria das vezes ele não executa
    • É preciso distribuir muitos arquivos .dll para lidar com os recursos do WinUI
    • Não é possível criar um único arquivo .exe portátil
    • Em formato empacotado não há problema, mas ele é instalado como pacote AppX, o que causa problemas de acesso à API Win32

Win32 / MFC / pequenas bibliotecas que encapsulam Win32

  • Como é necessário alto grau de portabilidade, faz sentido usar a renderização nativa do sistema operacional
  • O programa pode ser um único arquivo .exe e também pode ser bem pequeno (com linkagem estática do MFC)
  • Também é possível usar bibliotecas mais minimalistas que alguém já tenha criado
  • Problemas:
    • Estilizar os controles padrão do Win32 é muito difícil
    • É preciso escrever pintura personalizada para todos os controles
    • Existe um modo escuro "oculto" usado pelo Explorador de Arquivos do Windows, mas ele cobre apenas alguns controles e ainda assim não fica bom

Qt

  • O santo graal das GUIs em C++
  • É complexo, mas pode ser estilizado facilmente com Qt Style Sheets
  • Problemas:
    • Ao fazer linkagem dinâmica, há inúmeras .dll necessárias para rodar o app, e o tamanho passa de 40 MB
    • É possível fazer linkagem estática do Qt no programa, mas aí é preciso tornar o código open source ou distribuir arquivos-objeto para recompilação por causa da licença LGPL do Qt
    • Ou então comprar a licença comercial, que custa milhares de dólares

wxWidgets

  • Biblioteca fácil de aprender
  • É possível usar o wxFormBuilder
  • Tem uma licença mais permissiva que a do Qt e pode ser vinculada estaticamente em um executável de 3 MB
  • Problemas:
    • No Windows, usa componentes nativos do Win32 e não oferece opções de estilização
    • Suporta aplicar os controles escuros do Explorador de Arquivos do Windows, mas o resultado não é muito bom

hikogui

  • Nova biblioteca GUI em retained mode usando Vulkan como backend
  • Tem modo escuro embutido e é fácil de estilizar
  • Problemas:
    • É preciso um doutorado em ciência da computação para compilar com sucesso
    • Depois de tentar compilar os exemplos por mais de 30 minutos, o único resultado foi um executável que travava imediatamente com violação de acesso dentro da biblioteca Vulkan

Sciter

  • Boa alternativa ao Electron para escrever GUIs de apps desktop usando HTML/CSS
  • Problemas:
    • O tamanho final do app, cerca de 25 MB com todas as .dll, parece ser um problema, mas é aceitável
    • Seria melhor se fosse open source e permitisse usar uma versão de linkagem estática para uso comercial
    • Não é tão caro quanto o Qt ($310), então pagar por isso seria aceitável
    • O problema é que a renderização não é tão boa
    • Houve problemas de aliasing em fontes e imagens
    • A janela tem uma moldura cinza relativamente grossa (2–3 px) que não pode ser personalizada nem modificada

WinForms / WPF

  • Quando se pergunta sobre bibliotecas GUI em C++, a maioria recomenda usar outra stack
    • Dizem que C++ é uma má ideia, então o frontend do programa deveria ser feito em outra stack e os recursos escritos em C++ carregados como componentes/módulos
  • É possível ter um único .exe pequeno e usar WinForms/WPF
  • Basta embutir as .dll como recursos no app e extraí-las para uma pasta temporária, depois usar P/Invoke e chamar as .dll compiladas de dentro do app C#/.NET, ou usar C++/CLI
  • Problemas:
    • O .NET Framework vem pré-instalado no Windows 10 ou superior, então tecnicamente atende ao critério de não ter dependências
      • Ao embutir as .dll, elas precisam ser extraídas para algum lugar, e é necessário escrever código extra para que o P/Invoke funcione
      • O C++/CLI é compilado para código IL do .NET, então o código C++ traduzido para C# fica aparente

Solução?

  • Para apps simples, parece não haver nada mais adequado que Dear ImGui
  • A principal desvantagem ao projetar UIs complexas é que ele não é uma UI em retained mode, mas em immediate mode, então é necessário rodar um renderizador GPU como DirectX para renderizar a UI a mais de 60 quadros por segundo
  • Mas, em todos os outros aspectos, ele se encaixa
  • O programa compilado tem apenas 500 KB e não exige instalar o VC++ Redistributable

Opinião do GN⁺

  • Como o autor disse, parece não existir uma biblioteca perfeita para desenvolvimento de apps GUI. Há trade-offs dependendo dos requisitos
  • Para apps simples, Dear ImGui parece ser a melhor opção, mas para criar UIs complexas talvez seja melhor usar um toolkit GUI em retained mode
  • Para criar apps comerciais, o custo de licença pode ser um fator importante. Bibliotecas como Qt têm custo alto, enquanto wxWidgets pode ser usado gratuitamente
  • Criar apps GUI em C++ não é algo fácil, então pode ser mais realista desenvolver o frontend em C# ou outra linguagem e implementar em C++ apenas as partes intensivas em desempenho
  • Se você quer um look-and-feel nativo no Windows, usar WinUI ou MFC pode ser melhor, mas se precisa de suporte multiplataforma, Qt ou wxWidgets podem ser escolhas melhores

7 comentários

 
tsboard 2024-07-05

hikogui é uma coisa assustadora mesmo ddd

 
fastkoder 2024-07-03

https://getstream.io/blog/flutter-desktop-vs-electron/ Comparando o desempenho com várias métricas

 
fastkoder 2024-07-03

Em comparação com Sciter e Electron, também vale a pena considerar o Flutter Windows Desktop Build. Há plugins que às vezes têm bugs, mas a base é sólida, então ele pode ser usado como meio de entrega.
Instância singleton, atualização automática, bandeja do sistema, notificações do Windows, tempo de inicialização rápido, linguagem Dart, plugin da Win32API etc.

 
soone 2024-07-03

Delphi

 
soone 2024-07-03

C++ Builder

 
joyfui 2024-07-02

"Para compilar com sucesso, é preciso ter doutorado em Ciência da Computação"
kkkk

 
GN⁺ 2024-07-01
Comentário no Hacker News
  • Ao ler muitos comentários, percebi que toda a premissa estava errada. Seria melhor renomear a postagem do blog para "Escrever apps GUI para Windows é doloroso quando os requisitos são irrealistas"
  • Seria melhor usar o .NET Framework 3.5 mirando WinForms. Ele já vem instalado em todas as versões modernas do Windows
  • O texto oferece uma boa visão geral de várias opções, mas os requisitos específicos do autor acabam eliminando muitas delas
    • Querer um estilo de GUI totalmente personalizado sem precisar escrever suas próprias funções de renderização transforma isso em uma busca por uma biblioteca de GUI fácil de personalizar
    • A exigência de um executável autocontido e de um limite de tamanho abaixo de 40 MB também elimina muitas opções. O Qt poderia atender a esses requisitos, mas a licença open source não se alinhava ao objetivo e ele não queria comprar uma licença
    • Se você permitir dependências, aceitar um download maior ou usar os controles GUI nativos do Windows, o cenário muda bastante
    • Se a meta é criar uma GUI leve e totalmente personalizada, sem dependências externas, e com uma licença permissiva, eu esperaria que ImGui fosse a resposta
  • Aponta que não há uma grande falha na ideia de WinForms/WPF, mas não comenta além de dizer que isso exige duas stacks. Ele quer código nativo e não quer ver C#, mas não explica por quê. Talvez seja medo de engenharia reversa. Código de UI raramente contém segredos
    • Distribuir em um único exe às vezes é conveniente, mas neste cenário pode ser incômodo. Um empacotador como Velopack (Squirrel) permite distribuir como um único exe e ainda adiciona atualização automática. Ter dois ou mais arquivos no disco após a instalação é um bom meio-termo
    • O Windows é a pior plataforma para desenvolver aplicativos desktop, excluindo todas as outras plataformas
  • Tenho uma opinião muito baixa sobre desenvolvedores que reclamam de ter que pagar por licenças comerciais de bibliotecas de software sob LGPL. Eles esperam ser remunerados pelo próprio trabalho e garantem isso criando software de código fechado. Mas os desenvolvedores que resolveram a parte realmente difícil de criar uma biblioteca de UI é que deveriam ser adultos e presentear o mundo com seu código de graça
  • Sobre o Sciter e o problema de "anti-aliasing"... o autor não ativou o suporte a DPI de alta resolução no aplicativo
    • Dá para corrigir ativando isso no Visual Studio ou incluindo o manifesto apropriado
    • Isso é explicado no tutorial "Hello C++"
  • Mais precisamente:
    • "Portátil" (um único exe sem autoextração)
    • Quer algo comercial e não quer redistribuir arquivos de objeto compilados (o que, junto com o requisito de "portátil", não permite LGPL)
    • Modo escuro
    • Apps GUI para Windows são dolorosos. Se remover qualquer um desses requisitos, há muitas boas opções
    • A maioria dos aplicativos "portáteis" usa win32. Em geral, portátil significa um aplicativo pequeno e simples, em que a funcionalidade importa mais do que modo escuro ou outras capacidades de estilização
  • Sendo alguém que exige muito do open source dos outros, o autor não pretende abrir em open source a própria solução
  • Estou trabalhando em um toolkit GUI que atende aos requisitos: Slint - https://slint.dev
    • Pode ser compilado estaticamente em um único .exe com menos de 40 MB. Tem uma licença gratuita para uso em desktop. Oferece estilos claro/escuro. Também inclui um editor WYSIWYG de arrastar e soltar (em desenvolvimento)
  • A afirmação de que seria preciso escrever funções de pintura personalizadas para todos os controles mostra que a filosofia antiga do win32 não combina com o autor. O elemento central do win32 é o wndproc. A maioria dos controles pergunta ao pai sobre as cores
    • Se isso for inconveniente, encapsular em uma pequena biblioteca para remover o boilerplate não é um grande problema
  • O resultado deve ser um único arquivo .exe com nenhuma dependência ou com dependências mínimas, e com tamanho inferior a 40 MB
    • Hoje em dia, os computadores já têm um navegador moderno. Em vez de um arquivo .exe, dá para usar um único arquivo .html com imagens/CSS/JavaScript inline