API Win32 direta, janelas de formato estranho e por que a maioria delas desapareceu
(warped3.substack.com)- Os apps modernos do Windows ficaram mais lentos e pesados por causa da dependência de frameworks baseados na web, e o controle em nível de sistema operacional da era Win32 se perdeu
- A API Win32 permitia definir livremente a forma das janelas por meio do loop de mensagens e objetos HRGN, e os designs de janela fora do padrão eram comuns
- Usando bitmaps e a tecnologia de janelas em camadas, era possível implementar janelas de forma livre com transparência e animação
- No entanto, as janelas personalizadas foram desaparecendo gradualmente por causa da complexidade de implementar manualmente todos os recursos básicos e da mudança na preferência dos usuários por simplicidade
- Mesmo assim, o Win32 ainda oferece liberdade para controlar janelas e experimentar, mantendo a possibilidade de criar software de desktop criativo
A monotonia dos apps modernos do Windows e a liberdade perdida do Win32
- Hoje, a maioria dos apps de desktop para Windows roda sobre wrappers de navegador como React, Electron, Tauri, transformando-se em estruturas complexas baseadas na web, lentas e com uso excessivo de memória
- Até um simples bloco de notas ocupa 50MB de memória, enquanto um app com a mesma função escrito em Win32 C puro usa apenas 1,8MB
- Mesmo em hardware moderno, o uso de memória ao iniciar o Windows 11 chega a 77%
- No passado, quando se programava diretamente com a API Win32, havia controle total em nível de sistema operacional
- Naquela época, não era preciso ficar preso a janelas retangulares: era possível criar livremente janelas de forma não padronizada
- Na era do Windows XP, vários apps, incluindo o Windows Media Player, tinham aparências únicas
As janelas de “formato estranho” do passado
- Houve um tempo em que os apps do Windows eram criados em formas variadas para expressar identidade e personalidade
- Players de mídia pareciam hardware, mascotes de desktop passeavam pela tela, e painéis utilitários eram desenhados como painéis de instrumentos, brinquedos ou consoles alienígenas
- A forma da janela não precisava ser retangular, e o objetivo da UI era mais personalidade do que usabilidade
- O motivo de essas formas terem desaparecido hoje é que os programadores já não controlam mais a própria janela
- A maioria dos frameworks modernos de UI esconde o sistema operacional, e os desenvolvedores trabalham apenas dentro de uma área retangular limitada
A estrutura orientada a mensagens do Win32 e o controle de janelas
- O núcleo da programação Win32 está no loop de mensagens de eventos
- O loop composto por
GetMessage,TranslateMessageeDispatchMessageé a base de todo o funcionamento - O comportamento da janela é definido ao tratar mensagens como “WM_CREATE”, “WM_PAINT”, “WM_SIZE” e “WM_DESTROY”
- O loop composto por
- Com HRGN (Region Object), é possível mudar livremente o formato da janela
- Ao definir uma região na janela com
SetWindowRgn, apenas aquela área passa a ser reconhecida como janela real - No código de exemplo,
CreateEllipticRgncria uma janela elíptica, e a função de arrastar é implementada manualmente sem barra de título - Em “WM_LBUTTONDOWN”, envia-se “WM_NCLBUTTONDOWN” com “HTCAPTION” para simular a movimentação da janela
- Ao definir uma região na janela com
- Assim, embora criar a forma seja fácil, o principal desafio é ter de implementar por conta própria os recursos antes fornecidos pelo frame padrão
Janelas baseadas em bitmap e janelas em camadas
- O exemplo “drivenbyimage/main.c” define a forma da janela a partir de dados de bitmap
- Ele carrega “shape.bmp” e define como região da janela os pixels que não correspondem à cor transparente (magenta)
- O bitmap funciona ao mesmo tempo como imagem exibida na tela e forma real da janela
- No passado, apps com skin usavam esse método para criar formas variadas, como cachorro, nave espacial, rádio ou rosto de personagem
- Porém, regiões baseadas em bitmap têm bordas rígidas e não permitem semitransparência
- Para bordas suaves ou animação, é preciso usar janelas em camadas (
WS_EX_LAYERED)
- Para bordas suaves ou animação, é preciso usar janelas em camadas (
- No exemplo “Animated/”, uma imagem de 32 bits com canal alfa transparente é enviada com
UpdateLayeredWindow- Com GDI+, uma sprite sheet é desenhada em um bitmap em memória para trocar os frames, e isso é exibido na área de trabalho
- A forma da janela não é fixa; o próprio estado atual dos pixels se torna a forma da janela
- Esse método oferece transparência suave, mudança de forma a cada frame e animação natural
A dificuldade das janelas personalizadas e a mudança cultural
- Ao criar janelas personalizadas com a API Win32, é preciso tratar manualmente todos os comportamentos detalhados
- Arrastar, redimensionar, fechar, entrada por teclado, suporte a DPI e outros recursos que a janela padrão tratava automaticamente precisam ser implementados manualmente
- Fazer um protótipo é fácil, mas refiná-lo até virar um produto polido exige alto custo e muito esforço
- Os usuários passaram a preferir estabilidade e simplicidade a esse tipo de experimento visual
- Janelas fora do padrão muitas vezes passaram a ser associadas a adware, toolbars e utilitários desnecessários, gerando uma percepção negativa
- Como resultado, as “janelas de formato estranho” passaram a ser vistas mais como algo brincalhão do que software sério
O potencial e o significado ainda existentes do Win32
- Mesmo assim, o Win32 ainda oferece controle direto e liberdade de experimentação
- Só com mensagens, handles e APIs de desenho, já é possível ter controle de janelas em nível de sistema operacional
- Na maioria dos casos, janelas retangulares são uma escolha sensata, mas isso relembra que esse formato é uma opção, não uma obrigação
- O código de exemplo está disponível no repositório GitHub WierdApps
- Inclui três amostras: janela elíptica, janela baseada em bitmap e mascote animado
- O Win32 ainda torna possível a criação de software de desktop criativo e experimental
1 comentários
Comentários do Hacker News
Espero que as janelas com formatos estranhos não voltem
Só porque dá para fazer não significa que deva ser feito
O fato de os apps de hoje feitos com wrappers de navegador como React, Electron, Tauri parecerem todos parecidos é porque eles não usam os frameworks de GUI do sistema operacional
Quando cada app usa seus próprios widgets não padronizados, cores e formas, a acessibilidade e a usabilidade vão por água abaixo
Ironicamente, hoje os apps que mais enfatizam “identidade” costumam ser coisas como painéis de controle de drivers enfiados por fabricantes de hardware, e isso é o pior tipo de bloatware
Eu gosto de Win32, mas acho que a antiga cultura de skins esquisitas foi um prenúncio da mentalidade atual de “branding = identidade”
Isso acabou levando à proliferação de Electron e bibliotecas de widgets pela metade
A menos que seja um app especializado como Blender ou Ardour, uma GUI cheia de personalidade não é prioridade
Os sistemas operacionais de hoje não são mais para indivíduos, e sim para empresas. A era do Win3.1~XP foi a verdadeira era da computação pessoal
Os apps baseados em React de hoje não têm consistência nem com o sistema operacional, nem entre si
A UI muda a cada 6 meses, mas o UX não melhora. A acessibilidade (a11y) foi completamente esquecida
Antigamente, software era feito por poucas pessoas e mantido de forma estável por muito tempo
Agora tudo mudou para iteração rápida e equipes grandes, e o design flat é o resultado adequado para esse ambiente
O design skeuomórfico exige criar novos assets o tempo todo, então custa caro
No fim, virou uma era em que velocidade e escala vêm primeiro, como quando móveis entalhados à mão foram substituídos por móveis planos de montagem
Com a era do HiDPI, ficou mais difícil desenhar a UI em nível de pixel como antes
Na época do Win95~XP, você podia desenhar direto no front buffer, o que era rápido e usava pouca memória, mas hoje cada janela mantém um buffer de backup e isso consome mais RAM
Ao ler a frase “The point was usually not usability. It was identity.”, pensei que parecia um texto escrito por LLM
Já desenvolvi apps para Windows, e a interface Win32 só permitia controlar cerca de 90% das coisas
Lembro de ter tentado mudar o tema de cores e acabar tendo de reimplementar a MessageBox manualmente
O Notepad feito em Win32 C puro usa só 1,8 MB, mas os blocos de notas de hoje usam 50 MB
Até o GNU Emacs consome menos memória
Já o EDIT.EXE em modo texto usa só 520 KB, então é muito mais eficiente
Antigamente havia um app de gravação de CDs para Mac chamado Disco, e enquanto o disco era gravado aparecia uma animação de fumaça subindo sobre a janela
O próprio Steve Jobs mostrou isso no palco e gostou bastante
Fiquei feliz de o artigo também mencionar mascotes de desktop
Recentemente vi um vídeo de um desktop pet feito em Godot, que funciona em várias plataformas
Dá um pouco de trabalho, mas não chega ao nível de complexidade do Win32. Para entusiastas de desktop pets, é uma boa opção