- Bu açık kaynak proje, yalnızca C ve Win32 API ile geliştirilmiş hafif bir yerel Windows Todo uygulamasıdır
- Framework'e bağımlı olmadan minimum boyutta (en fazla 26.5KB) çalışır ve gelişmiş Windows GUI ile sistem entegrasyonunu doğrudan uygular
- Todo öğesi ekleme, düzenleme, silme, tamamlandı olarak işaretleme gibi temel işlevlerin yanı sıra sistem tepsisi entegrasyonu ve otomatik başlatma seçeneği gibi gerçek üretkenlik özellikleri sunar
- Depolama, ikili dosya üzerinden kalıcıdır ve AppData klasöründe en fazla 100 yapılacaklar listesini saklar
- Büyük framework'ler olmadan işletim sistemine çok yakın klasik programlama yaklaşımı ve hafif çalışma ortamı öne çıkan güçlü yanlarıdır
🌟 Simple Todo (C / WinAPI)
Proje genel bakışı
- Bu proje, yalnızca C ve Win32 API kullanarak modern bir yerel Windows Todo uygulaması oluşturur
- Gelişmiş Windows GUI programlama ve sistem entegrasyonu yeteneklerini sergiler
- Proje boyutu son derece küçüktür (en fazla 26.5KB) ve Windows'un kendine özgü görünümünü korur
✨ Başlıca özellikler
- Yapılacak öğeleri oluşturma, düzenleme ve silme mümkündür
- Görevler tamamlandı olarak işaretlenebilir
- AppData'ya kalıcı olarak kaydedilir, böylece veriler her zaman korunur
- Sistem tepsisi ile entegredir ve simge durumuna küçültüldüğünde tepsiye taşınır
- Yerel Windows stili görünüme sahiptir
- Windows başlangıcında otomatik çalıştırma seçeneği sunulur
🛠️ Teknik ayrıntılar
- Tamamı saf C ile yazılmıştır
- GUI uygulaması için yalnızca Win32 API kullanılır
- Küçük çalıştırılabilir dosya boyutu (UPX ile sıkıştırıldığında 26.5KB)
- Sistem tepsisi entegrasyonu
- Manifest aracılığıyla modern görsel stiller uygulanır
💾 Veri depolama
- Tüm yapılacaklar tek bir ikili dosyada saklanır
- Depolama yolu:
%APPDATA%\TodoApp\todos.dat
- İkili formattadır ve en fazla 100 öğe saklayabilir
📋 Gereksinimler
- Windows işletim sistemi ortamı gerekir
- MinGW-w64 (GCC derleyicisi) ve Windows SDK gerekir
🎮 Kullanım
bin/todo.exe çalıştırıldıktan sonra arayüz üzerinden şu işlemler yapılabilir
- "Add" düğmesiyle yeni yapılacak ekleme
- Bir öğeyi seçip "Edit"e tıklayarak düzenleme
- "Delete" ile öğe silme
- "Complete" ile tamamlandı olarak işaretleme
- Her öğe için öncelik belirlenebilir
🏗️ Proje yapısı
src/ klasöründe ana giriş noktası (main.c), yapılacak yönetim mantığı (todo.c), yapı tanımı (todo.h), GUI uygulaması (gui.c) bulunur
bin/ içinde derlenmiş çalıştırılabilir dosya yer alır
- Derleme betiği (
build.bat) ve proje belgeleri dahildir
🔧 Geliştirme öğeleri
- Win32 API: pencere yönetimi ve GUI'nin genel uygulaması
- Common Controls: modern UI öğelerinin kullanımı
- UXTheme: Windows görsel stillerinin uygulanmasına destek
- File I/O: kalıcı veri depolamayı gerçekleştirir
📝 Lisans
- MIT lisansı ile serbestçe kullanılabilir ve değiştirilebilir
🤝 Katkı rehberi
- Pull Request'ler memnuniyetle karşılanır
- Herkes projeye katılabilir
📫 İletişim ve bağlantılar
3 yorum
Tam bir nostalji havası var.
Hacker News görüşleri
strcpy,sprintfkullandığını gördüm; eğer ciddi programlama yapılıyorsa mutlaka uzunluk kontrolü olan varyantlar kullanılmalı. Derleyicinin hemen uyarı vermemiş olmasına şaşırdım. Win32 API’de standart C kütüphanesi işlevlerinin yerine geçebilecek pek çok fonksiyon da var. Çalıştırılabilir dosya boyutunu daha da küçültmek istiyorsan sadece<Windows.h>kullanıpcstdlibolmadan yazmayı denemeni öneririm.memsetyerineZeroMemory,memcpyyerineCopyMemorykullanılabilir. Elbette raw C ile kod yazmak bir noktadan sonra oldukça acı verici hâle geliyor ama ilk birkaç seferde bunu saf C ile yapmak öğrenmek için en faydalısı. Bu tür küçük ayrıntılarla uğraşırken mimari sezgi gelişiyor. Win32 GUI programlamayı daha fazla denemek istersen WTL’yi (Windows Template Library) de öneririm; Win32 API’yi C++ ile sarmalayarak nasıl çalıştığını anlamayı çok daha kolaylaştırıyor.strcpyyerinestrncpykullanmak gerekir; yoksa herkes bunu sürekli eleştirir. Zig kullanmanın büyük nedenlerinden biri de bu tür yaygın hataları azaltması. Tabii C de gayet olur.memsetyerineZeroMemory,memcpyyerineCopyMemorydenmesiyle ilgili olarak, MSVC intrinsic’lerirep stos/movskomutlarını kullanıyor; böylece fonksiyon çağrısından daha küçük kod çıkıyor ve import table boyutu da azalıyor.memsetvememcpyyerineZeroMemory,CopyMemorysunmalarının nedeni neydi diye merak ediyorum; neden mevcut standart C kütüphanesi yerine özellikle bunları yapmışlar?CreateWindowçağırmak yerine.rcdosyalarıyla dialog resource yazılırdı (Visual Studio’da bir dialog editor de var) veCreateDialogkullanılırdı. Böylece tüm kontroller tek seferde oluşturulurdu. Sadece application manifest ekleyerek modern UI stili ve yüksek DPI desteği de sağlanabiliyor.user32:SetProcessDpiAwarenessContext,shcore:SetProcessDpiAwareness,user32:SetProcessDPIAware) DPI farkındalığını etkinleştirmeyi deniyor. Gerçekten çok eski sürümlerde ise hiçbir şey çağrılmıyor.build.batdosyasınıncore.autocrlf=falseayarında düzgün çalışmaması olduğunu gördüm. Bunucore.autocrlf=trueyapıp yeniden clone edince derleme başarılı oldu. MinGW’nin belirli bir toolchain’i 102KB’lık bir.exeüretiyor; yani 278KB’den çok daha verimli. Daha da küçültmek istersen GCC’ye ek flag’ler verilebilir.gcc -s -Oz -fltoile 47KB’ye kadar inmek mümkün. Sadece binary boyutuyla ilgileniliyorsa geliştirilecek çok yer var.quickrun.exede yapmıştı. Sadece C ve saf Win32 API kullanıyordu. Binary boyutunu azaltmak için özel bir hile yoktu, Mingw32 derleyicisi kullanılmıştı. Alias ile uygulamaları hızlı başlatan bir GUI uygulamasıydı.YoutubeGOdiye başka bir uygulamam da var, ona da bakarsan sevinirim.std::string,std::array,std::list, anonymous namespace kullanıpmalloc’ı da çıkarırsan kod yarı uzunluğa iner ve hata sayısı azalır.std::stringvestd::list’e geçince ortaya çıkan assembly’nin aynı kalacağını sanmak, iç işleyişi pek bilmediğini gösteriyor.stringveyaarray/listkullanalım görüşüne karşılık, WinAPI’yi doğrudan kullanıyorsanstd::stringyerine API ile daha uyumlu olduğu içinLPWSTR(wide string) kullanmak daha mantıklı olabilir ve tavsiye edilir.char[]gibi eski yöntemlerdenseLPWSTRdaha uygun.std::arrayya dalistkullanmanın da kodu daha iyi yapacağını sanmıyorum.Ağabeylerin nefesi buraya kadar ulaşıyor gibi bir his...