สวัสดีครับ ออกจะแปลกไปสักเล็กน้อยนะครับ สำหรับตอนนี้ เพราะยังคงเป็นบทความเล่ารำลึกถึงความหลังอยู่อีกนั่นแหละ
ที่บอกว่า แปลก เพราะปกติ จะไม่มีใครเขาพูดกันถึงเรื่องอดีตที่มาของการหัดเล่น หัดทำโปรแกรม ของตัวเองกันสักเท่าไหร่ แต่ผมไม่คิดอย่างนั้นครับ เพราะว่า บางครั้ง การได้เล่าอะไรบางอย่างผ่านตัวบทความ ทำให้เราได้เรียบเรียงความคิด ถึงเหตุการณ์ นั้นซ้ำอีกครั้งหนึ่ง และในบางครั้ง ประสบการณ์ที่เราถ่ายทอดออกไปนั้น อาจจะเป็นประโยชน์ต่อผู้มาใหม่ในภายหลังก็ได้ เพราะสาขาวิชานี้ ก็มีคนเข้าเรียนทุกปีอยู่แล้วครับ
อีกจุดหนึ่ง ที่อาจจะพอถูไถไปได้บ้าง นั่นก็เพราะว่า ผมเป็นโปรแกรมเมอร์พันธุ์ทางครับ ไม่ใช่พันธุ์แท้ ของที่ศึกษามาก็มาจากการงมๆหาด้วยตัวเองเป็นหลัก ไม่สังกัดองค์กรที่ไหน เลยไม่คิดว่าจะต้องมีอะไรกั๊กกันล่ะครับ 555+ มาเข้าเรื่องกันเลยจะดีกว่า
นับจากวันที่ผมเริ่มต้นรู้จักกับ การเขียนโปรแกรมด้วย ภาษา C บน windows ตอนนั้น ก็อยู่ในช่วง ประมาณปี 1998 (ผมยึดตาม windows 98 น่ะ) จนมาถึงปัจจุบันที่มี Dot net คือ ปี 2006 แล้ว ก็ถือว่าเกือบจะ 10 ปีได้แล้ว… (ล่าสุด คือ 2009-20010 แล้วนะ)
แต่สำหรับผมแล้ว ก็ยังคงเป็นคนที่อยู่นอกวงการโปรแกรมเมอร์อยู่ดี คงเป็นเพราะว่า ไม่ได้ใช้งานมันไปในทางลึกๆมากนัก แค่พอใช้งานได้ ภาษาโปรแกรมที่ได้ใช้ทำงานจริงๆ จะเป็น VB (VB ที่ว่านี้คือ Visual Basic นั่นเอง) แต่ว่า VB เอง ก็ไม่ใช่ทางที่ถูกต้องของผม แต่ที่ต้องใช้เพราะมันสร้างงานได้ไว ในระหว่างนั้นนั่นแหละ ก็มีการเกิดขึ้นของภาษาใหม่และPlatform ใหม่ คือ dot net ขึ้นมา พร้อมกับ C# ซึ่งทำให้ผมงง และสับสนว่า จะเอาไงดีหว่า เพราะว่า เมื่อมองจากพื้นฐานของตัวเองแล้ว เป็นไปได้ยากที่จะเข้ากับภาษาใหม่พวกนั้น แค่ของเดิมที่มีก็ค่อนข้างจะโคตรยากถึงยากสุดๆแล้ว ต้องใช้ระยะเวลามาเข้าใจของใหม่อีก ไม่ทันกินแน่ ทำไงดี
ก่อนที่จะบอกว่า ผมตัดสินใจไปยังไง ขอเล่าถึง พื้นฐานในการพยายามเขียนโปรแกรมด้วยภาษา C กันก่อน C For Windows ที่ว่านี้ คือการใช้งานกับ WIN API ซึ่งเป็นมาตรฐานที่ถูกกำหนดมาโดย Windows นี่แหละ ที่ผ่านมา ผมเองยังไม่เคยใช้ Win API ทำโปรแกรมอะไรที่มันดีๆเป็นชิ้นเป็นอันเลย ในขณะที่ VB นั้น ทำไปแล้ว 2 โปรแกรม โดยเฉพาะโปรแกรมที่สอง คือ โปรแกรมแสดงบัญชี เขียนไว้ดีมากๆ จนอดคิดไม่ได้ว่า แล้ว WIN API จะทำได้ดีขนาดนั้นไหม เอาล่ะ พูดออกนอกเรื่องไปเยอะแล้ว กลับมาใหม่ มาทบทวนกันในส่วนของพื้นฐาน ซึ่งผมเองเป็นลักษณะดังนี้
มีอยู่ช่วงหนึ่ง ผมกำลังหาวิธีการทำระบบ Graphic กันอยู่แล้ว ก็เจอเข้ากับคำสั่งของ DirectX และ OpenGL เข้า ซึ่งสามารถใช้งานได้ใกล้เคียงกัน และ เป็นเครื่องมือติดต่อกับระบบกราฟฟิก 2/3 มิติในคอมพิวเตอร์ทั้งคู่ ปัญหามันอยู่ที่ว่า มันทำงานได้เร็วเมื่อเรียกใช้จาก Win API จะใช้ตัวอื่นก็ได้ เช่น MFC เพียงแต่เรียกจะใช้ได้ช้ากว่า (จาก Tutorial ไม่แนะนำให้ใช้ว่างั้น) ดังนั้น ก็เลยต้องย้อนกลับมางม Win API กันต่อ นอกจากนั้น ผมยังเจอปัญหาในการเขียน อ่าน ไฟล์ข้อมูลในระบบ Windows อีกด้วย ทำให้ผมต้องกระโดดไปมาระหว่าง Pascal,MFC,C++ Builder โดยเทียบเคียงกับ VB (เพราะ VB ทำได้ครับ เฮ้อ -*-” )และไม่ได้แตะ C Win API เลย เพราะว่า Code ยาว
ยิ่งไปกว่า นั้น ผมยังพบปัญหาของการเขียนโปรแกรมเพื่อติดต่อกับ control มาตรฐานของ Windows บางตัว ในการใช้งาน เมื่อเปลี่ยนการใช้เครื่องมือและ platform ที่เขียน ตัวอย่างเช่น Control ที่ชื่อว่า ListView ที่ใน VB ใช้งานได้ดี มีเอกสารช่วยเหลือมากมาย ต่างกับโปรแกรมของ Delphi/C++ Builder ที่ไม่มีข้อมูลของ control ตัวนี้ ทั้งคู่ และถ้าใช้ MFC ก็พอใช้ได้เช่นกัน แต่เมื่อกลับมาใช้ C Win API พบว่า หาข้อมูลได้น้อย ถึง น้อยมาก งง ไปเลยล่ะ (ณ เวลานั้น Google เพิ่งเกิดใหม่ๆ ยังไม่ใช้กันแพร่หลายเหมือนทุกวันนี้) สำหรับ Control ที่ MFC ใช้ จะมีวิธีการเรียกใช้งานแบบ ActiveX ซึ่งดูไม่รู้เรื่อง ว่าจะใช้งานได้ยังไง ผลสุดท้ายผมเลยต้องใช้งานกับ VB แทนซึ่งก็ทำออกมาได้ดีมากๆเลยทีเดียว ทำให้ไม่รู้ว่าจะหาทางโปรแกรม C Win API ให้ได้ใกล้เคียงกับ VB ยังไงดี
(หมายเหตุ: ในเดือน กรกฎาคม ปี 2550 พบว่า control ของ VB ที่ชื่อ Listview Control นั้นมีจุดบอดในเรื่องการ Insert Item ในขณะที่ C Win API แก้ไขปัญหานี้ผ่านไปได้เรียบร้อยแล้ว)
สำหรับเรื่องของ Listview Control นี้ มีเกร็ดเิพิ่มเติมเล็กน้อย นั่นคือ คำว่า Listview เป็นชื่อเรียกของ control หน้าตาแบบนี้ใน VB ,VB.Net,C Sharp.Net เท่านั้น แต่ถ้าเป็นของ C/C++ จะเรียกชื่อ control ตัวนี้ว่า List Control เฉยๆ ซึ่งชื่อจะไปคล้ายกันกับ control อีกตัวหนึ่ง ก็คือ ListBox control ซึ่งอันนั้นทำได้แค่ใส่ list รายชื่อให้เราเลือกเฉยๆ ส่วน List หรือ Listview Control นี้มีลูกเล่นที่ทำอะไรได้มากกว่าครับ อย่าสับสนล่ะ เพราะเจอเข้ากับตัวเองมาแล้ว ตอนที่หาวิธีจัดการเรื่องการ Insert Item ทั้งของ VB และ C++ นั่นแหละ
ในส่วนของการสร้างโปรแกรมด้วย C Win API วิธีการสร้าง โปรแกรมที่มี control ต่างๆเพื่อใช้งานนั้น จะเริ่มต้นจากการสร้าง Dialog ขึ้นมาก่อน แล้ว ใส่ control ต่างๆที่ต้องการใช้งานลงไป จากนั้น ทำการ Map Code เข้ากับ ID ของ Control นั้นๆ ส่วน MFC มีวิธีใช้งานที่แตกต่างกันออกไปคือ Map เป็น class ไปเลย สำหรับ C++ Builder ใช้งานเหมือนกับ VB เลย ต่างแค่ภาษาเท่านั้นเอง (ซึ่งยากกว่าเยอะเลย) ซึ่ง dialog ที่ได้ จะเก็บอยู่ในไฟล์ ที่เรียกว่า Resource Script พร้อมกับ Header ที่ระบุ ID ของ Control นั้นๆ
ขอเอารูปเก่ามาหากินอีกที นี่คือ ตัวอย่างการสร้างโปรแกรมแบบ Dialog Box แบบ C Win API ครับ
เมื่อดูแล้ว ก็ไม่เห็นมีอะไรเปลี่ยนแปลงมาก แค่ต้องเปลี่ยนภาษาที่ใช้ Program ให้เราทำงานได้ง่ายๆนี่นา จริงๆ แล้ว ทุกอย่างน่าจะลงตัวที่ VB แล้วถ้าไม่เจออะไรที่ต้องเปลี่ยนอย่างร้ายแรงมากๆ
ส่วนจะเป็นอะไรนั้น คอยติดตามกันในตอนหน้า สวัสดีครับ.
Leave a Reply


