ระบบพิกัดของวิชวลเบสิก
สรกานต์ ศรีตองอ่อน
การเขียนโปรแกรมบนวินโดวส์ จะต่างจากการเขียนโปรแกรมบนดอสอยู่หลายอย่างพอสมควร ที่เห็นได้ชัดคือ การเขียนโปรแกรมบนวินโดวส์ จะเขียนลงบนฟอร์ม (Form) ไม่ได้เขียนเพื่อให้แสดงที่หน้าจอโดยตรงแบบบนดอส ซึ่งระบบพิกัดที่ใช้นั้น จะอ้างอิงกับฟอร์ม โดยฟอร์มนี้ตามปกติสามารถปรับขนาดได้ ซึ่งพิกัดก็จะปรับตาม (ในที่นี้หมายถึงยังไม่มีการปรับการแสดงผลของฟอร์มและระบบพิกัด คือใช้ค่าที่ VB ตั้งมา) ซึ่งในแง่ของการแสดงผลกราฟิก อาจทำให้ได้ภาพที่ไม่เป็นไปตามที่ต้องการ
พิกัดตามปกตินั้นจะเป็นดังรูปที่ 1
รูปที่ 1 พิกัดของฟอร์มตามปกติ
และถ้าจะอธิบายให้ละเอียดยิ่งขึ้น พิกัดบนซ้าย (0,0) ก็คือ พิกัด (ScaleLeft, ScaleTop) ซึ่งค่าดีฟอลต์กำหนดที่ (0,0) นั่นเอง โดยที่ ScaleLeft, ScaleTop, ScaleWidth, ScaleHeight คือคุณสมบัติของฟอร์มที่สามารถกำหนดได้ทั้งใน Properties Window และการเขียนคำสั่ง
พิกัดนี้หน่วยเป็นอะไร?
หน่วยดีฟอลต์ของ VB คือ Twip (1440 Twip = 1 นิ้ว) ซึ่งมีคุณสมบัติ ScaleMode เป็นตัวควบคุม โดยสามารถเปลี่ยนเป็นหน่วยอื่นได้อีก ดูรายละเอียดได้ใน Properties Window หรือจากตารางดังนี้
ค่าของ ScaleMode |
หน่วย |
0 | ผู้ใช้กำหนดเอง |
1 | Twip |
2 | Point |
3 | Pixel |
4 | Character |
5 | Inch |
6 | Millimeter |
7 | Centimeter |
ข้อควรพิจารณาคือ ยกเว้นค่า 0 แล้ว ค่าอื่นๆเมื่อกำหนดขึ้น ScaleLeft, ScaleTop เริ่มที่ 0,0 ส่วน ScaleWidth และ ScaleHeight จะมีค่าในหน่วยนั้นๆ ตามขนาดของฟอร์ม คือเมื่อฟอร์มเกิดการเปลี่ยนแปลง ค่าความกว้างและความสูงก็จะเปลี่ยนแปลงตาม โดยที่หน่วย pixel นั้น จะขึ้นอยู่กับการเซ็ตความละเอียดของจอภาพด้วย
สำหรับค่า 0 นั้น ยืดหยุ่นกว่ามาก คือ เราสามารถตั้งค่าไว้แล้วเมื่อขนาดของฟอร์มเปลี่ยน ก็ตั้งให้ค่านั้นยังคงเดิมได้ (ดูตัวอย่างจะเห็นชัดขึ้นนะครับ)
ในทางปฏิบัติ
สำหรับในทางปฏิบัติแล้ว เราสามารถใช้ได้หลายๆวิธีในการกำหนดพิกัดจอภาพ ขึ้นอยู่กับวัตถุประสงค์ของโปรแกรมด้วย จะแสดงให้ดูพอสังเขปนะครับ ผู้อ่านสามารถแตกแขนงไอเดียไปได้อีกมากมาย
***** อย่าลืมว่าทุกวิธีจะต้องเซ็ตคุณสมบัติ AutoRedraw = True ***** |
วิธีที่ 1 พิกัดขยายตามฟอร์ม
ตรวจสอบจาก เมื่อฟอร์มเกิดการเปลี่ยนขนาด โปรแกรมจะรับรู้ที่เหตุการณ์ Resize เราก็เซ็ตพิกัดที่ฟอร์มนี้ (กรณี ScaleMode ไม่เท่ากับ 0)
ทดลองเขียนโปรแกรมให้ลากเส้นทแยงจากมุมบนซ้ายมามุมล่างขวา ที่เหตุการณ์ Resize ดังรูปที่ 2
รูปที่ 2
เมื่อรันดู จะแสดงดังรูปที่ 3
รูปที่ 3
เมื่อลองขยายฟอร์มดู จะสังเกตว่าเส้นทแยงนี้ ยังลากจากมุมบนซ้ายมามุมล่างขวาเหมือนเดิม
วิธีที่ 2 ตั้งพิกัดแบบเซ็ตฟอร์มไม่ให้ขยาย
วิธีต่อมาคือ เซ็ตฟอร์มแบบยึดแน่น และไม่ให้ขยายเต็มจอ วิธีการคือ ตั้งคุณสมบัติดังนี้
ฺ BorderStyle | 1 - Fixed Single |
MaxButton | False |
MinButton | True |
ต่อไปนี้จะแนะนำการใช้ ScaleMode = 0 นะครับ คือการตั้งค่าพิกัดเอง ซึ่งไม่จำเป็นต้องเริ่มที่ 0 และไม่จำเป็นต้องใช้หน่วยเฉพาะที่ VB กำหนด เช่น ใช้หน่วยเมตร ก็ได้ ซึ่งจะใช้ร่วมกับคำสั่ง
Scale (พิกัดมุมบนซ้าย) - (พิกัดมุมล่างขวา) |
เขียนโปรแกรมที่เหตุการณ์ Load โดยการทดลองลากเส้นกราฟแบ่ง 4 quadrant ดังรูปที่ 4
รูปที่ 4
เมื่อรันดู จะแสดงดังรูปที่ 5
รูปที่ 5
วิธีนี้สบายมาก คือกำหนดให้ตรึงฟอร์มไว้ วิธีนี้สามารถใช้กับความละเอียดของจอภาพที่แตกต่างได้ (640x480 หรือ 800x600 หรืออื่นๆ) แต่อย่าเซ็ตฟอร์มให้ใหญ่นัก คือ พิจารณากรณีบางเครื่องเซ็ตความละเอียดที่ 640x480 ด้วย (อันนี้จากประะสบการณ์ตรงนะครับ คือส่วนใหญ่โปรแกรมที่ผมและทีมสร้างขึ้นที่ผ่านมา ก็ไม่ค่อยให้ความสำคัญกับความละเอียดที่ 640x480 มากนัก คือ เซ็ตฟอร์มที่ใหญ่กว่าความละเอียดระดับนี้เหมือนกัน แต่ตอนนี้เรามีวิธีแล้วนะครับ)
วิธีที่ 3 วิธีที่ 1 และ 2 ผสมผสานกัน
ใช้ฟอร์มแบบวิธีที่ 1 คือปรับได้ แต่ใช้ ScaleMode = 0 แบบวิธีที่ 2 เพราะฉะนั้น การเชียนโปรแกรมจะต้องเขียนที่เหตุการณ์ Load และ Resize ด้วย ตัวอย่างที่จะให้แสดงผลเหมือนรูปที่ 5 แต่ปรับฟอร์มได้ เขียนโปรแกรมได้ดังรูปที่ 6
รูปที่ 6
วิธีที่ 4 ปรับฟอร์มแบบขยายเต็มจอ
วิธีนี้จะดีกว่า 3 วิธีข้างต้นในแง่ความละเอียดของจอภาพ ไม่มีผลต่อการเซ็ตพิกัด และตัดปัญหาเรื่องฟอร์มล้นจอภาพ การเขียนโปรแกรมก็คือใช้ตามบทความก่อนหน้านี้ คือ
- ตั้งฟอร์มแบบ WindowState = 2 คือขยายเต็มจอภาพ
- กำหนด ScaleMode = 0 คือกำหนดหน่วยเอง ในที่นี้ใช้หน่วยเมตร
โดยปรับคุณสมบัติเพิ่มคือ MaxButton = False (ขยายฟอร์มเต็มหน้าจอ แล้วตรึงไว้)
เมื่อปรับแล้วลองปรับความละเอียดจอภาพสังเกตการแสดงผลนะครับ จะเห็นว่าพิกัดจะยังคงเดิม และฟอร์มจะเต็มจอภาพทุกๆ ความละเอียด