- โปรเจกต์โอเพนซอร์สนี้เป็นแอป Todo แบบเนทีฟบน Windows ที่สร้างด้วย C และ Win32 API เท่านั้น
- ทำงานได้ด้วยขนาดที่เล็กมาก (สูงสุด 26.5KB) โดยไม่พึ่งพาเฟรมเวิร์ก และลงมือทำทั้ง Windows GUI ระดับสูงรวมถึงการผสานกับระบบด้วยตนเอง
- นอกจากฟังก์ชันพื้นฐานอย่าง เพิ่ม แก้ไข ลบ และทำเครื่องหมายว่างานเสร็จแล้ว สำหรับรายการ Todo ยังมีฟังก์ชันเพื่อ การใช้งานจริงด้านประสิทธิภาพ เช่น การผสานกับ system tray และตัวเลือกเริ่มทำงานอัตโนมัติ
- ที่เก็บข้อมูลเป็น ไฟล์ไบนารี แบบถาวร และบันทึกรายการสิ่งที่ต้องทำได้สูงสุด 100 รายการในโฟลเดอร์ AppData
- จุดเด่นคือการเขียนโปรแกรมแบบคลาสสิกที่แนบแน่นกับ OS มาก โดยไม่ใช้เฟรมเวิร์กขนาดใหญ่ และมีสภาพแวดล้อมการรันที่เบามาก
🌟 Simple Todo (C / WinAPI)
ภาพรวมโปรเจกต์
- โปรเจกต์นี้สร้าง แอป Todo แบบเนทีฟสมัยใหม่บน Windows โดยใช้เพียง C และ Win32 API
- แสดงให้เห็นความสามารถด้าน การเขียนโปรแกรม Windows GUI ระดับสูงและการผสานเข้ากับระบบ
- ตัวโปรเจกต์มีขนาดเล็กมาก (สูงสุด 26.5KB) และคงรูปลักษณ์เฉพาะของ Windows ไว้อย่างครบถ้วน
✨ ฟีเจอร์หลัก
- สามารถ สร้าง แก้ไข และลบรายการสิ่งที่ต้องทำ ได้
- สามารถ ทำเครื่องหมายว่างานเสร็จแล้ว ได้
- บันทึกถาวรใน AppData ทำให้ข้อมูลคงอยู่เสมอ
- ผสานกับ system tray และเมื่อย่อหน้าต่างจะย้ายไปอยู่ใน tray
- มีรูปลักษณ์แบบ Windows style เนทีฟ
- มีตัวเลือก ให้รันอัตโนมัติเมื่อเริ่ม Windows
🛠️ รายละเอียดทางเทคนิค
- เขียนทั้งหมดด้วย C ล้วน
- ใช้เพียง Win32 API สำหรับการทำ GUI
- ขนาดไฟล์รันได้เล็กมาก (26.5KB เมื่อบีบอัดด้วย UPX)
- มีฟังก์ชันผสานกับ system tray
- ใช้ modern visual style ผ่าน manifest
💾 การจัดเก็บข้อมูล
- งานทั้งหมดจะถูกเก็บไว้ใน ไฟล์ไบนารี เพียงไฟล์เดียว
- ตำแหน่งจัดเก็บ:
%APPDATA%\TodoApp\todos.dat
- เป็นฟอร์แมตไบนารีและรองรับการเก็บได้ สูงสุด 100 รายการ
📋 ข้อกำหนดที่จำเป็น
- ต้องใช้สภาพแวดล้อม ระบบปฏิบัติการ Windows
- ต้องมี MinGW-w64 (คอมไพเลอร์ GCC) และ Windows SDK
🎮 วิธีใช้งาน
- รัน
bin/todo.exe แล้วใช้อินเทอร์เฟซเพื่อทำงานต่อไปนี้ได้
- เพิ่มงานใหม่ด้วยปุ่ม "Add"
- เลือกรายการแล้วคลิก "Edit" เพื่อแก้ไข
- ลบรายการด้วย "Delete"
- ทำเครื่องหมายว่า เสร็จแล้ว ด้วย "Complete"
- สามารถกำหนดลำดับความสำคัญให้แต่ละรายการได้
🏗️ โครงสร้างโปรเจกต์
- ในโฟลเดอร์
src/ มี จุดเริ่มต้นหลัก (main.c), ลอจิกจัดการงาน (todo.c), การประกาศโครงสร้าง (todo.h), การทำ GUI (gui.c)
- ไฟล์รันที่คอมไพล์แล้วจะอยู่ใน
bin/
- มีสคริปต์ build (
build.bat) และเอกสารของโปรเจกต์รวมอยู่ด้วย
🔧 องค์ประกอบการพัฒนา
- Win32 API: ใช้จัดการหน้าต่างและ GUI ทั้งหมด
- Common Controls: ใช้องค์ประกอบ UI แบบสมัยใหม่
- UXTheme: รองรับการใช้ Windows visual style
- File I/O: ทำให้สามารถบันทึกข้อมูลแบบถาวรได้
📝 ใบอนุญาต
- ใช้งานและแก้ไขได้อย่างอิสระภายใต้ MIT License
🤝 การมีส่วนร่วม
- ยินดีรับ Pull Request
- ทุกคนสามารถมีส่วนร่วมกับโปรเจกต์ได้
📫 ติดต่อและลิงก์
3 ความคิดเห็น
มีความโรแมนติกดีนะ
ความเห็นจาก Hacker News
strcpy,sprintfถ้าจะเขียนโปรแกรมแบบจริงจังควรใช้ตัวแปรที่ตรวจสอบความยาวได้เสมอ น่าแปลกที่คอมไพเลอร์ไม่เตือนทันที ใน win32 API มีฟังก์ชันจำนวนมากที่ใช้แทนฟังก์ชันมาตรฐานของไลบรารี C ได้ ถ้าอยากลดขนาดไฟล์ executable ลงอีก แนะนำให้ลองเขียนโดยใช้แค่<Windows.h>โดยไม่พึ่ง cstdlib คุณใช้ZeroMemoryแทนmemsetและCopyMemoryแทนmemcpyได้ แน่นอนว่าการเขียน C แบบล้วน ๆ จะเริ่มทรมานมากในจุดหนึ่ง แต่ช่วงแรก ๆ การทำด้วย pure C เองมีประโยชน์ต่อการเรียนรู้ที่สุด มันช่วยสร้างเซนส์ด้านโครงสร้างในการจัดการรายละเอียดเล็ก ๆ พวกนี้ ถ้าอยากทำ GUI ด้วย win32 ต่ออีกหน่อยก็อยากแนะนำ WTL (Windows Template Library) ด้วย เพราะมันห่อ win32 API ด้วย C++ ทำให้เข้าใจวิธีการทำงานได้ง่ายขึ้นมากstrncpyแทนstrcpyไม่อย่างนั้นทุกคนจะคอยทักเรื่องนี้ต่อไป หนึ่งในเหตุผลใหญ่ที่ใช้ zig ก็คือมันช่วยลดความผิดพลาดพื้นฐานแบบนี้ได้ แน่นอนว่า C ก็ยังโอเคZeroMemoryแทนmemsetและCopyMemoryแทนmemcpyนั้น intrinsic ของ MSVC ใช้คำสั่งrep stos/movsทำให้โค้ดเล็กกว่าการเรียกฟังก์ชัน และยังลดขนาด import table ได้ด้วยZeroMemory,CopyMemoryมาแทนmemsetและmemcpyว่าทำไมถึงต้องสร้างสิ่งเหล่านี้ขึ้นมาแทนที่จะใช้ไลบรารีมาตรฐาน C เดิมCreateWindowแบบลำบากทุกครั้ง คนมักเขียน dialog resource เป็นไฟล์.rcแทน (ใน Visual Studio ก็มี dialog editor ให้ด้วย) แล้วใช้CreateDialogแบบนี้จะสร้าง control ทั้งหมดได้ในครั้งเดียว แค่เพิ่ม application manifest ก็รองรับ UI style แบบสมัยใหม่และ DPI ความละเอียดสูงได้user32:SetProcessDpiAwarenessContext,shcore:SetProcessDpiAwareness,user32:SetProcessDPIAwareถ้าเก่ามากจริง ๆ ก็จะไม่เรียกอะไรเลยbuild.batทำงานไม่ถูกต้องเมื่อใช้การตั้งค่าcore.autocrlf=falseพอเปลี่ยนเป็นcore.autocrlf=trueแล้วโคลนใหม่ก็ build สำเร็จ toolchain บางตัวของ mingw สร้าง.exeขนาด 102KB ได้ ซึ่งมีประสิทธิภาพกว่ามากเมื่อเทียบกับ 278KB ถ้าอยากลดลงอีกก็สามารถใส่แฟลกเพิ่มให้ GCC ได้ เช่นgcc -s -Oz -fltoก็ลงไปถึง 47KB ได้เลย ถ้าสนใจแค่ขนาดไบนารี ยังมีพื้นที่ให้ปรับปรุงอีกมากquickrun.exeขนาด 15KB ด้วยเหมือนกัน ใช้แค่ C กับ pure Win32 API ไม่มีเทคนิคพิเศษในการลดขนาดไบนารี ใช้คอมไพเลอร์ Mingw32 เป็นแอป GUI สำหรับเปิดแอปอย่างรวดเร็วด้วย aliasstd::string,std::array,std::list, anonymous namespace และเลิกใช้mallocคุณน่าจะได้โค้ดสั้นลงครึ่งหนึ่งพร้อมบั๊กลดลงด้วยstd::string,std::listไม่ได้แปลว่าผลลัพธ์แอสเซมบลีจริงจะเหมือนเดิม ความเห็นนี้ดูเหมือนไม่เข้าใจการทำงานภายในจริง ๆLPWSTR(wide string) จะเข้ากับ API มากกว่าstd::stringและน่าแนะนำกว่า แบบเก่าอย่างchar[]ก็ควรเปลี่ยนเป็นLPWSTRส่วนstd::arrayหรือlistก็คงไม่ได้ทำให้โค้ดดีขึ้นนักพี่ๆ ลมหายใจอุ่นๆ เหมือนส่งมาถึงตรงนี้เลย...