- Este projeto open source é um aplicativo leve e nativo de Todo para Windows feito apenas com C e a API Win32
- Funciona com tamanho mínimo e sem depender de frameworks (até 26,5 KB), implementando diretamente uma GUI avançada do Windows e integração com o sistema
- Além das funções básicas, como adicionar, editar, excluir e marcar tarefas como concluídas, oferece recursos de produtividade reais, como integração com a bandeja do sistema e opção de inicialização automática
- O armazenamento é persistente em arquivo binário, salvando até 100 listas de tarefas na pasta AppData
- O grande diferencial é a programação clássica, muito próxima do sistema operacional, sem frameworks pesados e com ambiente de execução leve
🌟 Simple Todo (C / WinAPI)
Visão geral do projeto
- Este projeto cria um app moderno e nativo de Todo para Windows usando apenas C e a API Win32
- Ele demonstra habilidades avançadas de programação de GUI no Windows e integração com o sistema
- O projeto é muito pequeno (até 26,5 KB) e mantém integralmente a aparência nativa do Windows
✨ Principais recursos
- Permite criar, editar e excluir tarefas
- É possível marcar tarefas como concluídas
- Os dados ficam salvos de forma persistente no AppData, então nunca se perdem
- Integra-se à bandeja do sistema, indo para a bandeja ao minimizar
- Tem aparência no estilo nativo do Windows
- Oferece opção de execução automática na inicialização do Windows
🛠️ Detalhes técnicos
- Todo o código foi escrito em C puro
- Usa apenas a API Win32 para implementar a GUI
- Tamanho minúsculo do executável (26,5 KB com compressão UPX)
- Recurso de integração com a bandeja do sistema
- Aplicação de estilos visuais modernos por meio de manifesto
💾 Armazenamento de dados
- Todas as tarefas são armazenadas em um único arquivo binário
- Caminho de armazenamento:
%APPDATA%\TodoApp\todos.dat
- O formato é binário e suporta até 100 itens
📋 Requisitos
- É necessário um ambiente com sistema operacional Windows
- São necessários MinGW-w64 (compilador GCC) e o Windows SDK
🎮 Como usar
- Execute
bin/todo.exe e use a interface para realizar as ações abaixo
- Adicione uma nova tarefa com o botão "Add"
- Selecione um item e clique em "Edit" para modificá-lo
- Exclua um item com "Delete"
- Use "Complete" para marcá-lo como concluído
- É possível definir a prioridade de cada item
🏗️ Estrutura do projeto
- A pasta
src/ contém o ponto de entrada principal (main.c), a lógica de gerenciamento de tarefas (todo.c), a declaração das estruturas (todo.h) e a implementação da GUI (gui.c)
- O executável compilado fica em
bin/
- Inclui o script de build (
build.bat) e a documentação do projeto
🔧 Elementos de desenvolvimento
- API Win32: implementação de gerenciamento de janelas e da GUI como um todo
- Common Controls: uso de elementos modernos de UI
- UXTheme: suporte à aplicação dos estilos visuais do Windows
- File I/O: persistência dos dados
📝 Licença
- Pode ser usado e modificado livremente sob a licença MIT
🤝 Contribuição
- Pull Requests são bem-vindos
- Qualquer pessoa pode participar do projeto
📫 Contato e links
3 comentários
Tem um certo romantismo nisso.
Comentários do Hacker News
strcpyesprintf; se isso for programação séria, você realmente precisa usar variantes com verificação de tamanho. Fiquei surpreso que o compilador não tenha reclamado imediatamente. A API Win32 tem muitas funções que substituem as funções padrão da biblioteca C. Se quiser reduzir ainda mais o tamanho do executável, recomendo tentar escrever só com<Windows.h>, semcstdlib. Dá para usarZeroMemoryno lugar dememseteCopyMemoryno lugar dememcpy. Claro, codar em C puro fica extremamente doloroso em certo ponto, mas fazer isso em C puro nas primeiras vezes ajuda muito no aprendizado. Você desenvolve uma noção de composição ao lidar com esses detalhes. Se quiser explorar mais programação GUI com Win32, também recomendo WTL (Windows Template Library), que encapsula a API Win32 em C++ e facilita bastante entender como tudo funcionastrcpyporstrncpy; caso contrário, todo mundo vai continuar apontando isso. Um dos grandes motivos para usar Zig é justamente reduzir esse tipo de erro comum. Mas claro, C também é válidoZeroMemoryem vez dememseteCopyMemoryem vez dememcpy: os intrinsics do MSVC usam instruçõesrep stos/movs, então o código fica menor do que com chamada de função, e a tabela de imports também diminuiZeroMemoryeCopyMemoryem vez de simplesmente usar a biblioteca padrão C já existente; queria entender por que criaram issoCreateWindowmanualmente toda vez, muita gente escrevia recursos de diálogo em arquivos.rc(o Visual Studio inclusive oferece um editor de diálogos) e usavaCreateDialog. Aí todos os controles são criados de uma vez. Se você adicionar apenas o manifest da aplicação, também consegue estilo de UI moderno e suporte a DPI altoCtrl-Apara selecionar texto em campos de texto, erro ao adicionar linhas etc. Então fico me perguntando em que sentido isso seria "moderno"user32:SetProcessDpiAwarenessContext,shcore:SetProcessDpiAwareness,user32:SetProcessDPIAware); se for uma versão realmente antiga, não chama nadabuild.batnão funcionava direito comcore.autocrlf=false. Depois de mudar paracore.autocrlf=truee clonar de novo, a build funcionou. Um certo toolchain do mingw gerou um.exede 102 KB, ou seja, bem mais eficiente que 278 KB. Se quiser reduzir ainda mais, dá para passar flags extras para o GCC: comgcc -s -Oz -fltodá até para chegar a 47 KB. Se o único interesse for tamanho de binário, ainda há bastante margem para melhorarquickrun.exede 15 KB, usando apenas C e a API Win32 pura. Não há nenhum truque especial para reduzir o binário, compilado com Mingw32; é um app GUI para iniciar apps rapidamente via aliasstd::string,std::array,std::list, namespaces anônimos e removermalloc, o resultado provavelmente seria metade do código e menos bugsstd::stringestd::listnão significa que o assembly gerado será igual; isso mostra desconhecimento real do funcionamento internoLPWSTR(wide string) no lugar destd::string, porque combina melhor com a API. RecomendoLPWSTRem vez de abordagens antigas comochar[]. Não acho questd::arrayoulisttornariam o código melhorIrmãos, dá até para sentir o bafo de vocês chegando até aqui...