บางครั้งเราจำเป็นต้องใช้ VB เพื่อพัฒนาโปรแกรมประมวลผลการวาดภาพข้อมูลทดสอบอย่างรวดเร็ว การเปลี่ยนเคอร์เซอร์ของเมาส์ในการควบคุมการวาดเป็นรูปแบบเคอร์เซอร์ขนาดใหญ่ที่ใช้ในซอฟต์แวร์ AutoCAD จะให้ผลลัพธ์ที่ดีกว่าเคอร์เซอร์ลูกศรธรรมดา แล้วเราจะใช้เคอร์เซอร์กากบาทขนาดใหญ่เช่นนี้ได้อย่างไร?
----ก่อนอื่น มาทำความเข้าใจเอฟเฟ็กต์ที่เราต้องการให้ได้ก่อน ถ้าเราวาดใน Picture control จากนั้นเมื่อเมาส์เลื่อนไปที่ตัวควบคุมนี้ เคอร์เซอร์ของเมาส์จะเปลี่ยนเป็นรูปกากบาทขนาดใหญ่ทันที และเส้นแนวนอนใน เคอร์เซอร์เปลี่ยนจากตัวควบคุมจากเส้นขอบด้านซ้ายไปยังเส้นขอบด้านขวา เส้นแนวตั้งจะเปลี่ยนจากเส้นขอบบนไปยังเส้นขอบล่างของตัวควบคุม นั่นคือ เคอร์เซอร์กากบาทขนาดใหญ่จะแบ่งตัวควบคุมการวาดออกเป็นสี่ส่วน เมื่อเมาส์เคลื่อนออกนอกตัวควบคุม เคอร์เซอร์จะกลับสู่รูปแบบดั้งเดิม
----หากต้องการใช้เคอร์เซอร์ดังกล่าว เราต้องดำเนินการด้วยตนเองโดยการวาดเส้น หากเมาส์อยู่ในตัวควบคุมการวาด ขั้นแรกให้วาดเส้นแนวนอนและแนวตั้งของเคอร์เซอร์ที่ตำแหน่งปัจจุบันของเมาส์ เมื่อตำแหน่งเมาส์เคลื่อนที่ ให้ลบเส้นแนวนอนและแนวตั้งดั้งเดิมของเคอร์เซอร์ก่อน แล้วจึงวาดแนวนอน เส้นของเคอร์เซอร์ที่ตำแหน่งใหม่ เส้นและเส้นแนวตั้ง จากนั้นเราต้องตอบสนองต่อเหตุการณ์ MouseMove ของตัวควบคุมการวาด แน่นอนว่าไม่ว่าเนื้อหาจะอยู่ในตัวควบคุมการวาด เราไม่สามารถทำลายเนื้อหาต้นฉบับได้เมื่อเราลบเส้นเคอร์เซอร์และวาดเส้นเคอร์เซอร์ใหม่ ดังนั้น เราจำเป็นต้องตั้งค่า DrawMode ของตัวควบคุมการวาดเป็น vbXorPen (โหมด XOR) วาดเส้นแนวนอนของเคอร์เซอร์ เมื่อเพิ่มเส้นแนวตั้ง ให้ใช้ XOR เพื่อรวมเส้นแนวนอนและเส้นแนวตั้ง สีพิกเซลถูกตั้งค่าเป็นค่า XOR ของสีเคอร์เซอร์และสีพิกเซลดั้งเดิม จากนั้นเส้นแนวตั้งและแนวนอนจะถูกวาดที่ตำแหน่งเดียวกันโดยใช้วิธี XOR และพิกเซลบนเส้นแนวนอนและแนวตั้งจะถูกวาดอีกครั้ง การดำเนินการ XOR ด้วยสีเคอร์เซอร์จะลบเส้นแนวนอนและแนวตั้งของเคอร์เซอร์ และคืนค่าเนื้อหาต้นฉบับในตัวควบคุมการวาด
---- เรายังต้องแน่ใจว่าเมื่อเมาส์เคลื่อนเข้าสู่ตัวควบคุมการวาด เคอร์เซอร์ของเมาส์ธรรมดาจะหายไปและมีเพียงเคอร์เซอร์กากบาทขนาดใหญ่เท่านั้นที่ปรากฏขึ้น ดังนั้น คุณสมบัติ MousePointer ของตัวควบคุมการวาดควรถูกตั้งค่าเป็น vbCuntom ซึ่ง เป็นแบบผู้ใช้กำหนด หลังจากตั้งค่าคุณสมบัติ MousePointer ของตัวควบคุมการวาดเป็น vbCustom แล้ว กราฟิกที่ผู้ใช้กำหนดที่เกี่ยวข้องควรถูกโหลดลงในคุณสมบัติ MouseIcon เนื่องจากเราหวังว่าตัวควบคุมการวาดจะมีเฉพาะเคอร์เซอร์ที่เราวาดเท่านั้น และไม่มีเคอร์เซอร์อื่น ๆ ดังนั้นจึงว่างเปล่า ( โปร่งใส) กราฟิกเคอร์เซอร์ คุณสามารถค้นหาไฟล์เคอร์เซอร์ แก้ไขผ่านเครื่องมือแก้ไขทรัพยากร เติมกราฟิกเคอร์เซอร์ทั้งหมดด้วยความโปร่งใส และบันทึกเป็น NoIcon.cur ตามที่เราต้องการ
---- ด้วยการตั้งค่าและการทำงานที่สำคัญข้างต้น เราสามารถรู้ถึงเคอร์เซอร์กากบาทขนาดใหญ่ได้ เมื่อใช้วิธี XOR ในการวาด เรายังสามารถบรรลุเอฟเฟกต์ "แถบยาง" ที่เห็นได้ทั่วไปในซอฟต์แวร์วาดภาพทั่วไป นั่นคือหลังจากใช้เมาส์เพื่อกำหนดจุดแล้ว ให้ลากเมาส์แบบไดนามิกเพื่อกำหนดจุดอื่นในระหว่างกระบวนการแบบไดนามิก การลากเมาส์จุดที่จะวาดคือ กราฟิกยังเปลี่ยนแบบไดนามิกตาม
---- ด้านล่างเราใช้ตัวอย่างเพื่อใช้งานเคอร์เซอร์กากบาทขนาดใหญ่ในตัวควบคุมการวาด และยังสาธิตวิธีใช้เอฟเฟกต์ "แถบยาง" เพื่อวาดรูปสี่เหลี่ยมผืนผ้า:
----สร้างโปรเจ็กต์ EXE มาตรฐานใหม่ใน VB เพิ่ม Picture control ให้กับ Form1 และตั้งชื่อเป็น PicDraw คุณสามารถโหลดไฟล์รูปภาพได้ โดยพื้นฐานแล้วขนาด PicDraw และขนาดของรูปภาพในนั้นจะครอบคลุมมากที่สุด แบบที่ 1 ก็เพียงพอแล้ว รหัสการใช้งานมีดังนี้ โปรแกรมนี้ทำงานใน VB5.0
ตัวเลือกที่ชัดเจน
ส่วนตัวOld_XAsโสด
ส่วนตัวOld_YAsโสด
PrivateisMouseDownAsBoolean
PrivateBox_X0Asเดี่ยว
PrivateBox_Y0เป็นโสด
PrivateBox_X1Asเดี่ยว
PrivateBox_Y1เป็นโสด
ปากกาส่วนตัวสีAsLong
ส่วนตัวCrossColorAsLong
ส่วนตัวSubForm_Load()
CrossColor=QBColor(8)
สีปากกา=QBColor(15)
picDraw.DrawMode=vbXorPen
picDraw.MouseIcon=โหลดรูปภาพ
(App.Path&"/no.cur")
picDraw.MousePointer=vbCustom
isMouseDown=เท็จ
Box_X0=Box_X1=Box_Y0=Box_Y1=0
สิ้นสุดย่อย
PrivateSubpicDraw_MouseDown
(ปุ่มเป็นจำนวนเต็ม,
ShiftAsInteger,XAsSingle,YAsSingle)
IfisMouseDown=Trueแล้ว
'จุดถูกกำหนดไว้ก่อนหน้านี้ด้วยเมาส์
กล่อง_X1=X
Box_Y1=ป
isMouseDown=เท็จ
picDraw.DrawMode=vbCopyPen
picDraw.Line(Box_X0,Box_Y0)-
(Box_X1,กล่อง_Y1),
เพนคัลเลอร์,บี
picDraw.DrawMode=vbXorPen
'วาดเคอร์เซอร์
picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y)
ครอสคัลเลอร์
picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
ครอสคัลเลอร์
เก่า_X=X
เก่า_Y=ป
อื่น
'กำหนดจุดยอดแรกของสี่เหลี่ยม จากนั้นลบเคอร์เซอร์
picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y)
ครอสคัลเลอร์
picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
ครอสคัลเลอร์
กล่อง_X0=X
Box_Y0=ป
isMouseDown=จริง
สิ้นสุดถ้า
สิ้นสุดย่อย
PrivateSubpicDraw_MouseMove (ปุ่มเป็นจำนวนเต็ม,
ShiftAsInteger,XAsSingle,YAsSingle)
IfisMouseDown=Trueแล้ว
'ลากเมาส์เพื่อกำหนดจุดยอดอื่นของสี่เหลี่ยม
ณ จุดนี้ให้ลบสี่เหลี่ยมก่อนหน้าแล้ววาดรูปสี่เหลี่ยมใหม่
picDraw.Line(Box_X0,Box_Y0)-(เก่า_X,เก่า_Y),
เพนคัลเลอร์,บี
picDraw.Line(Box_X0,Box_Y0)-(X,Y),สีปากกา,B
อื่น
'ลบเคอร์เซอร์บรรทัดเก่า
picDraw.Line(0,Old_Y)-(picDraw.ScaleWidth,Old_Y)
ครอสคัลเลอร์
picDraw.Line(Old_X,0)-(Old_X,picDraw.ScaleHeight)
ครอสคัลเลอร์
'วาดเส้นเคอร์เซอร์ใหม่
picDraw.Line(0,Y)-(picDraw.ScaleWidth,Y)
ครอสคัลเลอร์
picDraw.Line(X,0)-(X,picDraw.ScaleHeight),
ครอสคัลเลอร์
สิ้นสุดถ้า
เก่า_X=X
เก่า_Y=ป
สิ้นสุดย่อย ->