- Dieses Open-Source-Projekt ist eine leichtgewichtige native Windows-Todo-Anwendung, die ausschließlich mit C und der Win32 API erstellt wurde
- Es läuft ohne Abhängigkeit von Frameworks mit minimaler Größe (maximal 26,5 KB) und implementiert fortgeschrittene Windows-GUI- und Systemintegration direkt
- Es bietet nicht nur Grundfunktionen wie Todo-Einträge hinzufügen, bearbeiten, löschen und als erledigt markieren, sondern auch praxisnahe Produktivitätsfunktionen wie System-Tray-Integration und eine Autostart-Option
- Die Speicherung erfolgt dauerhaft in einer Binärdatei; im AppData-Ordner können bis zu 100 Aufgabenlisten gespeichert werden
- Zu den Stärken zählen klassisches, eng am Betriebssystem orientiertes Programmieren ohne große Frameworks und eine leichtgewichtige Laufzeitumgebung
🌟 Simple Todo (C / WinAPI)
Projektüberblick
- Dieses Projekt erstellt eine moderne native Windows-Todo-App ausschließlich mit C und der Win32 API
- Es demonstriert fortgeschrittene Fähigkeiten in Windows-GUI-Programmierung und Systemintegration
- Das Projekt ist sehr klein (maximal 26,5 KB) und behält das originale Erscheinungsbild von Windows bei
✨ Hauptfunktionen
- Todo-Einträge erstellen, bearbeiten und löschen
- Aufgaben können als erledigt markiert werden
- Dauerhafte Speicherung in AppData, sodass die Daten immer erhalten bleiben
- Integration in das System-Tray, sodass die App beim Minimieren ins Tray verschoben wird
- Ein Erscheinungsbild im nativen Windows-Stil
- Eine Option für den Autostart beim Windows-Start
🛠️ Technische Details
- Vollständig in reinem C geschrieben
- Für die GUI wird ausschließlich die Win32 API verwendet
- Winzige Größe der ausführbaren Datei (26,5 KB mit UPX-Komprimierung)
- Integration in das System-Tray
- Moderne visuelle Styles über ein Manifest
💾 Datenspeicherung
- Alle Todos werden in einer einzigen Binärdatei gespeichert
- Speicherpfad:
%APPDATA%\\TodoApp\\todos.dat
- Binärformat mit Unterstützung für bis zu 100 Einträge
📋 Voraussetzungen
- Eine Windows-Betriebssystem-Umgebung ist erforderlich
- MinGW-w64 (GCC-Compiler) sowie das Windows SDK werden benötigt
🎮 Verwendung
- Nach dem Start von
bin/todo.exe können über die Oberfläche folgende Aktionen ausgeführt werden
- Mit dem Button "Add" ein neues Todo hinzufügen
- Einen Eintrag auswählen und mit "Edit" bearbeiten
- Mit "Delete" einen Eintrag löschen
- Mit "Complete" als erledigt markieren
- Für jeden Eintrag kann eine Priorität festgelegt werden
🏗️ Projektstruktur
- Im Ordner
src/ befinden sich Haupteinstiegspunkt (main.c), Todo-Verwaltungslogik (todo.c), Strukturdeklarationen (todo.h) und GUI-Implementierung (gui.c)
- In
bin/ liegt die kompilierte ausführbare Datei
- Enthält das Build-Skript (
build.bat) sowie die Projektdokumentation
🔧 Entwicklungselemente
- Win32 API: Implementierung von Fensterverwaltung und der gesamten GUI
- Common Controls: Verwendung moderner UI-Elemente
- UXTheme: Unterstützung für visuelle Windows-Styles
- File I/O: Realisierung dauerhafter Datenspeicherung
📝 Lizenz
- Frei nutzbar und modifizierbar unter der MIT-Lizenz
🤝 Hinweise zur Mitarbeit
- Pull Requests willkommen
- Jede Person kann am Projekt mitwirken
📫 Kontakt und Links
3 Kommentare
Das hat einfach Charme.
Hacker-News-Kommentare
strcpyundsprintfverwendest; wenn man ernsthaft programmiert, sollte man unbedingt Varianten mit Längenprüfung verwenden. Ich bin überrascht, dass der Compiler nicht sofort gewarnt hat. In der win32-API gibt es viele Funktionen, die Standardfunktionen der C-Bibliothek ersetzen. Wenn du die EXE noch kleiner machen willst, würde ich empfehlen, nur<Windows.h>zu verwenden und ohnecstdlibzu schreiben. Stattmemsetkann manZeroMemory, stattmemcpyCopyMemoryverwenden. Natürlich wird rohes C-Coding irgendwann ziemlich schmerzhaft, aber die ersten paar Male hilft es beim Lernen am meisten, alles direkt in purem C zu machen. Man entwickelt dadurch ein Gefühl für solche Details. Wenn du mehr win32-GUI-Programmierung ausprobieren willst, würde ich auch WTL (Windows Template Library) empfehlen. Sie kapselt die win32-API in C++ und macht es viel leichter, die Funktionsweise zu verstehen.strcpydurchstrncpyersetzen, sonst wird das jeder ständig anmerken. Einer der großen Gründe, Zig zu verwenden, ist, dass solche häufigen Fehler seltener werden. Aber natürlich ist auch C okay.memsetZeroMemoryund stattmemcpyCopyMemoryzu verwenden: MSVC-Intrinsics nutzen dierep stos/movs-Instruktionen, wodurch der Code kleiner wird als ein Funktionsaufruf und auch die Importtabelle schrumpft.memsetundmemcpyüberhauptZeroMemoryundCopyMemorygibt: Warum hat man so etwas extra gebaut, statt einfach die vorhandene C-Standardbibliothek zu nutzen?CreateWindowjedes Mal mühsam aufzurufen oft Dialog-Ressourcen in einer.rc-Datei beschrieben (Visual Studio hatte dafür auch einen Dialog-Editor) und dannCreateDialogverwendet. Dann werden alle Controls auf einmal erzeugt. Wenn man nur ein Application-Manifest hinzufügt, bekommt man auch modernen UI-Stil und Unterstützung für hohe DPI.Ctrl-Azum Markieren im Textfeld, Fehler beim Hinzufügen von Zeilen und so weiter. Inwiefern das in irgendeinem Sinn "modern" sein soll, ist mir unklar.user32:SetProcessDpiAwarenessContext,shcore:SetProcessDpiAwareness,user32:SetProcessDPIAware). Bei wirklich alten Versionen wird gar nichts aufgerufen.build.batmitcore.autocrlf=falsenicht korrekt funktionierte. Nachdem ich das aufcore.autocrlf=truegeändert und das Repo neu geklont hatte, ließ es sich bauen. Ein bestimmtes mingw-Toolchain erzeugt eine.exevon 102 KB, also deutlich effizienter als 278 KB. Wenn man noch weiter reduzieren will, kann man GCC zusätzliche Flags geben: Mitgcc -s -Oz -fltosind sogar 47 KB möglich. Wenn es nur um Binärgröße geht, gibt es noch viel Spielraum.quickrun.exemit 15 KB gebaut, nur mit C und der puren Win32-API. Kein besonderer Trick zur Größenreduktion, kompiliert mit Mingw32; es ist eine GUI-App, die Programme per Alias schnell startet.std::string,std::array,std::list, anonymen Namespaces und ohnemallocwürde der Code halb so lang und weniger fehleranfällig werden.std::stringoderstd::listam Ende dieselbe Assemblerausgabe herauskommt, zeigt, dass man die internen Abläufe nicht wirklich versteht.stringoderarray/listzu verwenden: Wenn man schon direkt mit der winapi arbeitet, dann passtLPWSTR(Wide String) besser zur API alsstd::stringund ist eher zu empfehlen. Jedenfalls eher als altmodischechar[]-Methoden. Ich glaube nicht, dassstd::arrayoderlistden Code wirklich besser machen würden.Leute, ich habe das Gefühl, als würde ich den Atem der alten Hasen bis hierher spüren ...