- Proyek open source ini adalah aplikasi Todo Windows native ringan yang dibuat hanya dengan C dan Win32 API
- Berjalan dengan ukuran minimum tanpa bergantung pada framework (maksimum 26.5KB), sambil mengimplementasikan GUI Windows tingkat lanjut dan integrasi sistem secara langsung
- Menyediakan bukan hanya fitur dasar seperti menambah, mengedit, menghapus, dan menandai selesai item Todo, tetapi juga fitur produktivitas nyata seperti integrasi system tray dan opsi auto-start
- Penyimpanan bersifat persisten dalam file biner, dan menyimpan hingga 100 daftar tugas di folder AppData
- Kelebihannya adalah pendekatan pemrograman klasik yang sangat dekat dengan OS tanpa framework besar serta lingkungan eksekusi yang ringan
๐ Simple Todo (C / WinAPI)
Gambaran proyek
- Proyek ini membuat aplikasi Todo Windows native modern hanya dengan C dan Win32 API
- Menunjukkan kemampuan pemrograman GUI Windows tingkat lanjut dan integrasi sistem
- Ukuran proyek sangat kecil (maksimum 26.5KB), sambil tetap mempertahankan tampilan khas Windows
โจ Fitur utama
- Bisa membuat, mengedit, dan menghapus item tugas
- Tugas dapat ditandai selesai
- Disimpan secara permanen di AppData sehingga data selalu terjaga
- Terintegrasi dengan system tray dan berpindah ke tray saat diminimalkan
- Memiliki tampilan gaya Windows native
- Menyediakan opsi jalankan otomatis saat Windows dimulai
๐ ๏ธ Detail teknis
- Seluruhnya dikodekan dengan C murni
- Hanya menggunakan Win32 API untuk implementasi GUI
- Ukuran executable sangat kecil (26.5KB saat dikompresi dengan UPX)
- Fitur integrasi system tray
- Menerapkan modern visual style melalui manifest
๐พ Penyimpanan data
- Semua tugas disimpan dalam satu file biner
- Lokasi penyimpanan:
%APPDATA%\\TodoApp\\todos.dat
- Formatnya biner dan dapat menyimpan hingga 100 item
๐ Persyaratan
- Memerlukan lingkungan sistem operasi Windows
- Memerlukan MinGW-w64 (kompiler GCC) dan Windows SDK
๐ฎ Cara penggunaan
- Jalankan
bin/todo.exe, lalu gunakan antarmuka untuk melakukan tindakan berikut
- Tambahkan tugas baru dengan tombol "Add"
- Pilih item lalu klik "Edit" untuk mengubahnya
- Hapus item dengan "Delete"
- Tandai selesai dengan "Complete"
- Prioritas dapat ditetapkan untuk setiap item
๐๏ธ Struktur proyek
- Folder
src/ berisi titik masuk utama (main.c), logika pengelolaan tugas (todo.c), deklarasi struktur (todo.h), dan implementasi GUI (gui.c)
- Executable hasil kompilasi ditempatkan di
bin/
- Menyertakan skrip build (
build.bat) dan dokumentasi proyek
๐ง Elemen pengembangan
- Win32 API: implementasi manajemen jendela dan keseluruhan GUI
- Common Controls: penggunaan elemen UI modern
- UXTheme: dukungan penerapan Windows visual style
- File I/O: mewujudkan penyimpanan data persisten
๐ Lisensi
- Dapat digunakan dan dimodifikasi secara bebas dengan lisensi MIT
๐ค Panduan kontribusi
- Pull Request disambut
- Siapa pun dapat berpartisipasi dalam proyek ini
๐ซ Kontak dan tautan
3 komentar
Ada nuansa romantisnya.
Komentar Hacker News
strcpydansprintf; kalau pemrogramannya dilakukan dengan serius, sebaiknya wajib memakai varian yang memeriksa panjang. Agak mengejutkan kompiler tidak langsung memberi peringatan. Di win32 API ada banyak fungsi yang bisa menggantikan fungsi pustaka standar C. Kalau ingin ukuran executable lebih kecil lagi, saya sarankan coba menulis hanya dengan<Windows.h>tanpacstdlib. Anda bisa memakaiZeroMemoryalih-alihmemset, danCopyMemoryalih-alihmemcpy. Tentu saja menulis C mentah pada titik tertentu akan terasa sangat menyakitkan, tetapi beberapa kali pertama melakukannya langsung dengan C murni memang paling membantu untuk belajar. Anda jadi membangun kepekaan terhadap detail-detail kecil seperti ini. Jika ingin lebih banyak bereksperimen dengan pemrograman GUI win32, saya juga ingin merekomendasikan WTL (Windows Template Library), karena ia membungkus win32 API dengan C++ sehingga jauh lebih mudah memahami cara kerjanya.strncpydaripadastrcpy, kalau tidak semua orang akan terus mengomentarinya. Salah satu alasan besar memakai zig adalah karena kesalahan umum seperti ini jadi lebih jarang terjadi. Tentu saja C juga tidak masalah.ZeroMemoryalih-alihmemset, danCopyMemoryalih-alihmemcpy, intrinsic MSVC menggunakan instruksirep stos/movssehingga hasil kodenya lebih kecil daripada pemanggilan fungsi, dan ukuran import table juga berkurang.ZeroMemorydanCopyMemorysebagai penggantimemsetdanmemcpy: kenapa repot-repot membuat ini alih-alih memakai pustaka standar C yang sudah ada?CreateWindowsetiap kali, orang biasanya menulis resource dialog dalam file.rc(Visual Studio juga menyediakan editor dialog) lalu memakaiCreateDialog. Dengan begitu semua kontrol dibuat sekaligus. Tinggal tambahkan manifest aplikasi, maka gaya UI modern dan DPI resolusi tinggi juga bisa didukung.Ctrl-Auntuk memilih semua di field teks, ada error saat menambah baris, dan seterusnya. Jadi saya penasaran, dari sisi mana ini disebut "modern"?user32:SetProcessDpiAwarenessContext,shcore:SetProcessDpiAwareness,user32:SetProcessDPIAware), dan jika versinya benar-benar sangat lama maka tidak memanggil apa pun.build.battidak berjalan benar saat pengaturancore.autocrlf=false. Setelah saya ubah menjadicore.autocrlf=truedan clone ulang, build berhasil. Toolchain mingw tertentu menghasilkan.exeberukuran 102KB, jadi jauh lebih efisien daripada 278KB. Kalau ingin lebih kecil lagi, Anda bisa menambahkan flag ekstra ke GCC. Dengangcc -s -Oz -flto, ukurannya bahkan bisa turun sampai 47KB. Kalau yang Anda pedulikan hanya ukuran biner, masih banyak ruang perbaikan.quickrun.exeberukuran 15KB, hanya dengan C dan pure Win32 API. Tidak ada trik khusus untuk mengecilkan biner, memakai kompiler Mingw32, dan aplikasinya adalah GUI untuk menjalankan aplikasi dengan cepat lewat alias.std::string,std::array,std::list, anonymous namespace, serta menghapusmalloc, Anda mungkin akan melihat panjang kode terpotong setengah dan bug berkurang.std::stringataustd::listtidak berarti hasil assembly akhirnya akan sama. Komentar itu benar-benar menunjukkan tidak paham bagaimana bagian dalamnya bekerja.LPWSTR(wide string) lebih cocok dengan API dibandingstd::string, jadi itu yang saya rekomendasikan. Daripada metode lama sepertichar[],LPWSTRlebih disarankan. Saya juga tidak merasastd::arrayataustd::listakan membuat kodenya lebih baik.Bro, rasanya seperti embusan napas kalian sampai terasa di sini...