ระบบพิกัดของวิชวลเบสิก อ่าน 4,691

ระบบพิกัดของวิชวลเบสิก

สรกานต์  ศรีตองอ่อน

 

    การเขียนโปรแกรมบนวินโดวส์ จะต่างจากการเขียนโปรแกรมบนดอสอยู่หลายอย่างพอสมควร ที่เห็นได้ชัดคือ การเขียนโปรแกรมบนวินโดวส์ จะเขียนลงบนฟอร์ม (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 (ขยายฟอร์มเต็มหน้าจอ แล้วตรึงไว้)

 

เมื่อปรับแล้วลองปรับความละเอียดจอภาพสังเกตการแสดงผลนะครับ จะเห็นว่าพิกัดจะยังคงเดิม และฟอร์มจะเต็มจอภาพทุกๆ ความละเอียด

 

คะแนน:
ร่วมแสดงความคิดเห็น (Post Comment)