- Este proyecto de código abierto es una aplicación ligera y nativa de Todo para Windows creada únicamente con C y la API Win32
- Funciona con un tamaño mínimo (sin depender de frameworks), de hasta 26.5 KB, e implementa directamente una GUI avanzada de Windows y la integración con el sistema
- Ofrece no solo funciones básicas como agregar, editar, eliminar y marcar como completadas las tareas, sino también funciones de productividad real como integración con la bandeja del sistema y opción de inicio automático
- El almacenamiento persistente usa un archivo binario, y guarda hasta 100 listas de tareas en la carpeta AppData
- Su fortaleza está en el enfoque clásico de programación, muy cercano al sistema operativo, sin grandes frameworks y con un entorno de ejecución ligero
🌟 Simple Todo (C / WinAPI)
Resumen del proyecto
- Este proyecto crea una app moderna y nativa de Todo para Windows usando únicamente C y la API Win32
- Demuestra capacidades avanzadas de programación GUI en Windows e integración con el sistema
- El proyecto es muy pequeño (hasta 26.5 KB) y conserva intacta la apariencia nativa de Windows
✨ Funciones principales
- Permite crear, editar y eliminar tareas
- Se pueden marcar tareas como completadas
- Se guardan de forma persistente en AppData, por lo que los datos siempre se conservan
- Se integra con la bandeja del sistema y al minimizarse se mueve a la bandeja
- Tiene una apariencia de estilo nativo de Windows
- Incluye una opción para ejecutarse automáticamente al iniciar Windows
🛠️ Detalles técnicos
- Todo está programado en C puro
- Solo usa la API Win32 para implementar la GUI
- Tamaño de ejecutable diminuto (26.5 KB con compresión UPX)
- Función de integración con la bandeja del sistema
- Aplicación de estilos visuales modernos mediante manifiesto
💾 Almacenamiento de datos
- Todas las tareas se guardan en un solo archivo binario
- Ruta de almacenamiento:
%APPDATA%\\TodoApp\\todos.dat
- Formato binario con capacidad para hasta 100 elementos
📋 Requisitos
- Se requiere un entorno con sistema operativo Windows
- Se necesitan MinGW-w64 (compilador GCC) y el Windows SDK
🎮 Cómo usarlo
- Ejecuta
bin/todo.exe y usa la interfaz para realizar las siguientes acciones
- Agrega una nueva tarea con el botón "Add"
- Selecciona un elemento y haz clic en "Edit" para modificarlo
- Elimina un elemento con "Delete"
- Márcalo como completado con "Complete"
- Es posible asignar una prioridad a cada elemento
🏗️ Estructura del proyecto
- En la carpeta
src/ se encuentran el punto de entrada principal (main.c), la lógica de gestión de tareas (todo.c), la declaración de estructuras (todo.h) y la implementación de la GUI (gui.c)
- El ejecutable compilado se ubica en
bin/
- Incluye el script de compilación (
build.bat) y la documentación del proyecto
🔧 Elementos de desarrollo
- API Win32: implementación de la gestión de ventanas y de toda la GUI
- Common Controls: uso de elementos modernos de UI
- UXTheme: soporte para aplicar estilos visuales de Windows
- File I/O: hace posible el almacenamiento persistente de datos
📝 Licencia
- Licencia MIT, con libertad de uso y modificación
🤝 Guía de contribución
- Pull Requests bienvenidos
- Cualquiera puede participar en el proyecto
📫 Contacto y enlaces
3 comentarios
Tiene su encanto.
Comentarios de Hacker News
strcpyysprintf; si estás programando en serio, de verdad deberías usar siempre variantes con verificación de longitud. Me sorprende que el compilador no te haya lanzado advertencias de inmediato. La API de Win32 tiene muchas funciones que reemplazan funciones estándar de la librería C. Si quieres reducir aún más el tamaño del ejecutable, te recomiendo probar escribirlo usando solo<Windows.h>y sincstdlib. Puedes usarZeroMemoryen lugar dememsetyCopyMemoryen lugar dememcpy. Claro, programar en C puro se vuelve tremendamente doloroso a partir de cierto punto, pero hacerlo así las primeras veces ayuda muchísimo a aprender. Te da intuición para manejar estos detalles pequeños. Si quieres seguir explorando programación GUI con Win32, también te recomendaría WTL (Windows Template Library), que envuelve la API de Win32 en C++ y hace mucho más fácil entender cómo funcionastrncpyen vez destrcpy; si no, todo el mundo te lo va a seguir señalando. Una de las grandes razones para usar Zig es justamente que reduce estos errores tan comunes. Igual C también está bienZeroMemoryen vez dememsetyCopyMemoryen vez dememcpy: los intrínsecos de MSVC usan instruccionesrep stos/movs, así que el código termina siendo más pequeño que una llamada a función, y además se reduce el tamaño de la tabla de importsZeroMemoryyCopyMemoryen lugar de simplemente usar la librería estándar de C; me da curiosidad por qué hicieron eso en vez de reutilizar lo que ya existíaCreateWindowuna y otra vez, era común escribir recursos de diálogo en archivos.rc(Visual Studio incluso trae editor de diálogos) y usarCreateDialog; así todos los controles se crean de una sola vez. Si además agregas el manifest de la aplicación, también puedes soportar estilo de UI moderno y DPI altouser32:SetProcessDpiAwarenessContext,shcore:SetProcessDpiAwareness,user32:SetProcessDPIAware). Si la versión es realmente muy antigua, no llama a ningunabuild.batno funciona bien concore.autocrlf=false; lo cambié acore.autocrlf=true, volví a clonar y ahí sí compiló. Cierta toolchain de MinGW genera un.exede 102 KB, o sea mucho más eficiente que 278 KB. Si quieres reducirlo más, puedes pasarle flags extra a GCC. Congcc -s -Oz -fltoincluso se puede llegar a 47 KB. Si lo único que te importa es el tamaño del binario, todavía hay mucho margen de mejoraquickrun.exede 15 KB usando solo C y la API pura de Win32. No hay truco mágico para reducir el binario, usó el compilador Mingw32. Es una app GUI para lanzar apps rápido mediante aliasstd::string,std::array,std::list, namespaces anónimos y eliminasmalloc, probablemente terminarías con la mitad del código y menos bugsstd::stringostd::listno significa que el resultado real en ensamblador vaya a ser el mismo; se nota que no entiendes de verdad lo que pasa internamenteLPWSTR(wide string) questd::string, y es lo recomendado. Mucho mejorLPWSTRque métodos antiguos comochar[]; no creo questd::arrayolistvayan a mejorar realmente el códigoSe siente como si el aliento nasal de los panas llegara hasta aquí...