หากคุณกำลังพัฒนาแอพพลิเคชั่นกราฟิกหรือมัลติมีเดีย คุณอาจสงสัยว่าจะย้ายแบบฟอร์มโดยไม่ต้องใช้แถบหัวเรื่องได้อย่างไร ที่จริงแล้วคุณเพียงแค่ลากพื้นที่ไคลเอนต์ของแบบฟอร์มด้วยเมาส์เท่านั้น
วิธีที่หนึ่ง
ต่อไปนี้เป็นวิธีทั่วไปที่สุดในการบรรลุฟังก์ชันข้างต้น: เพิ่มคำสั่งขั้นตอนต่อไปนี้ในส่วนคำสั่งส่วนตัวของแบบฟอร์ม:
ขั้นตอน WMNCHitTest (var Msg: TWMNCHitTest); ข้อความ WM_NCHITTEST;
จากนั้นเพิ่มรหัสต่อไปนี้ในส่วนการใช้งาน:
ขั้นตอน TForm1{หรือชื่อแบบฟอร์มที่คุณกำหนด}.WMNCHitTest(var Msg:TWMNCHitTest);
เริ่ม
DefaultHandler(ข่าวสารเกี่ยวกับ);
ถ้า Msg.Result = HTCLIENT แล้ว
ข่าวสารเกี่ยวกับผลลัพธ์:= HTCAPTION;
จบ;
วิธีนี้ทำให้ Windows คิดว่าแถบชื่อเรื่องถูกคลิกเมื่อคลิกเมาส์บนพื้นที่ไคลเอนต์ของแบบฟอร์ม
วิธีที่สอง
นี่เป็นอีกวิธีหนึ่งในการย้ายแบบฟอร์มปกติด้วยเมาส์
ขั้นตอน TForm1.FormMouseMove (ผู้ส่ง: TObject; Shift: TShiftState; X, Y: จำนวนเต็ม);
เริ่ม
ถ้า (ssLeft ใน Shift) ให้เริ่มต้น
ปล่อยจับภาพ;
ส่งข้อความ(Form1.Handle,WM_SYCOMMAND,SC_MOVE+1,0);
จบ;
จบ;
ความไม่สมบูรณ์ของวิธีการข้างต้น
มาดูกันว่าเกิดอะไรขึ้นเมื่อคุณยกเลิกการเลือกตัวเลือก "แสดงเนื้อหาของหน้าต่างขณะลาก" นี่คือการตั้งค่าสำหรับ Windows Windows คุณสามารถค้นหาคุณสมบัตินี้ได้ใน "Start Menu --> Settings --> Folder Options --> View --> Advanced Settings" ใน Windows95 คุณต้องแก้ไขรีจิสทรี เมื่อคุณสมบัตินี้ถูกตั้งค่าเป็นไม่ถูกต้อง แบบฟอร์มจะเปลี่ยนเป็นโครงร่างสี่เหลี่ยมเมื่อลาก บางทีคุณอาจใช้รูปแบบที่ไม่ปกติแต่ยังคงแสดงโครงร่างอยู่
เมื่อคุณต้องการให้แบบฟอร์มของคุณเทียบชิดขอบหน้าจอ (เช่น WinAmp เมื่อคุณลากแบบฟอร์มไปยังตำแหน่งเฉพาะที่ด้านบนของหน้าจอ แบบฟอร์มจะอยู่ใกล้กับด้านบนของหน้าจอ) หาก คุณใช้ขั้นตอนที่สองด้านบน ด้วยวิธีนี้ คุณจะไม่สามารถจัดการตำแหน่งของแบบฟอร์มได้จนกว่าจะปล่อยปุ่มเมาส์ และคุณจะไม่สามารถจัดการกับปัญหาการเชื่อมต่อได้
ด้านล่างนี้ฉันจะใช้วิธีการง่ายๆ ในการแก้ปัญหาสองข้อ:
ประการแรก ไม่ว่าการตั้งค่าจะเป็นเช่นไร โครงร่างจะไม่แสดงขึ้นเมื่อลากแบบฟอร์ม
ประการที่สอง การตรวจจับตำแหน่งจะดำเนินการเมื่อมีการย้ายแบบฟอร์ม และจะถูกเทียบท่าที่ตำแหน่งเฉพาะเมื่อตำแหน่งเหมาะสม
หลายๆ คนอาจแก้ไขปัญหาเหล่านี้ได้แล้ว แต่โค้ดด้านล่างนี้อาจช่วยคุณได้
วิธีที่สาม
คุณสามารถคัดลอกโค้ดต่อไปนี้ลงใน Delphi ได้โดยตรง โดยมีเงื่อนไขว่าคุณต้องบันทึก Form1 เป็น uMain.pas และ Form2 เป็น uDock.pas เหตุการณ์ที่ใช้คือ: OnMouseDown, OnMouseMove, OnMouseUp, OnShow (Form1)
นี่เป็นวิธีการย้ายแบบฟอร์มตามการเคลื่อนไหวของเมาส์ รวมถึงสองรูปแบบ ได้แก่ uMain และ uDock (Form1 และ Form2) Form2 ถูกเปิดผ่าน Form1 และสามารถเทียบชิดขอบด้านล่างของ Form1 ได้ เมื่อเชื่อมต่อแล้ว Form2 จะย้ายไปพร้อมกับ Form1 จนกว่าคุณจะย้าย Form2 ออกไป
แบบฟอร์ม1
หน่วย uMain;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ;
พิมพ์
TForm1 = คลาส (TForm)
ขั้นตอน FormMouseDown (ผู้ส่ง: TObject; ปุ่ม: TMouseButton; Shift: TShiftState; X, Y: จำนวนเต็ม);
ขั้นตอน FormMouseMove (ผู้ส่ง: TObject; Shift: TShiftState; X, Y: จำนวนเต็ม);
ขั้นตอน FormMouseUp (ผู้ส่ง: TObject; ปุ่ม: TMouseButton; Shift: TShiftState; X, Y: จำนวนเต็ม);
ขั้นตอน FormShow (ผู้ส่ง: TObject);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
DocktoForm: บูลีน;
{ประกาศสาธารณะ}
จบ;
var
แบบฟอร์ม 1: TForm1;
CanMove, CanMoveX, CanMoveY: บูลีน;
OldX, OldY: จำนวนเต็ม;
F1X,F1Y,F2X,F2Y: จำนวนเต็ม;
พื้นที่ทำงาน : TRect;
การดำเนินการ
ใช้ uDock;
{$R *.DFM}
ขั้นตอน TForm1.FormMouseDown (ผู้ส่ง: TObject; ปุ่ม: TMouseButton; Shift: TShiftState; X, Y: จำนวนเต็ม);
เริ่ม
CanMoveX := จริง;
CanMoveY := จริง;
CanMove := จริง;
เก่าX := X;
เก่า Y := Y;
ifDocktoForm แล้ว
เริ่ม
F1X := แบบฟอร์ม 1.ซ้าย;
F1Y := แบบฟอร์ม 1.ด้านบน;
F2X := ฟอร์ม2.ซ้าย;
F2Y := แบบฟอร์ม 2.ด้านบน;
จบ;
จบ;
ขั้นตอน TForm1.FormMouseMove (ผู้ส่ง: TObject; Shift: TShiftState; X, Y: จำนวนเต็ม);
เริ่ม
ถ้า (CanMove) แล้ว
เริ่ม
ถ้า CanMoveX แล้ว
Form1.Left := Form1.Left + (X - OldX);
ถ้า CanMoveY แล้ว
Form1.Top := Form1.Top + (Y - OldY);
//ส่วนนี้ล็อคไปด้านบน
ถ้า (Form1.Top < WorkArea.Top + 10) และ (Form1.Top > WorkArea.Top-10) แล้ว
เริ่ม
Form1.Top := WorkArea.Top;
ถ้า (Y-OldY > 10) หรือ (Y-OldY < -10) แล้ว
CanMoveY := จริง
อื่น
CanMoveY := เท็จ;
จบ;
//ส่วนนี้ล็อคไปทางด้านซ้าย
ถ้า (Form1.Left < WorkArea.Left+10) และ (Form1.Left > WoskArea.Left-10) แล้ว
เริ่ม
Form1.Left := WorkArea.Left;
ถ้า (X-OldX > 10) หรือ (X-OldX < -10) แล้ว
CanMoveX := จริง
อื่น
CanMoveX := เท็จ;
จบ;
// ส่วนนี้ล็อคไปทางด้านขวา
ถ้า (Form1.Left > WorkArea.Right-Form1.Width-10) และ (Form1.Left < WorkArea.Right-Form1.Width+10) แล้ว
เริ่ม
Form1.Left := WorkArea.Right-Form1.Width;
ถ้า (X-OldX > 10) หรือ (X-OldX < -10) แล้ว
CanMoveX := จริง
อื่น
CanMoveX := เท็จ;
จบ;
//ส่วนนี้เชื่อมโยงกับทาสก์บาร์
ifDocktoForm แล้ว
เริ่ม
ถ้า (Form1.Top > WorkArea.Bottom-Form1.Height-Form2.Height-10) และ (Form1.Top < WorkArea.Bottom-Form1.Height-Form2.Height+10) แล้ว
เริ่ม
Form1.Top := WorkArea.Bottom-Form1.Height-Form2.Height;
ถ้า (Y-OldY > 10) หรือ (Y-OldY < -10) แล้ว
CanMoveY := จริง
อื่น
CanMoveY := เท็จ;
จบ;
จบ
เริ่มอย่างอื่น
ถ้า (Form1.Top > WorkArea.Bottom-Form1.Height-10) และ (Form1.Top < WorkArea.Bottom-Form1.Height+10) แล้ว
เริ่ม
Form1.Top := WorkArea.Bottom-Form1.Height;
ถ้า (Y-OldY > 10) หรือ (Y-OldY < -10) แล้ว
CanMoveY := จริง
อื่น
CanMoveY := เท็จ;
จบ;
จบ;
ifDocktoForm แล้ว
เริ่ม
Form2.Left := Form1.Left - (F1X-F2X);// + (X-OldX);
Form2.Top := Form1.Top+Form1.Height;
ออก;
จบ;
// ส่วนนี้จะล็อคเพลย์ลิสต์ไว้ตรงกลางของ Form1
ถ้า (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) และ (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.ความกว้าง div 2))+10) และ
(Form2.Top > Form1.Top+Form1.Height-10) และ (Form2.Top < Form1.Top+Form1.Height+10) จากนั้น
เริ่ม
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
DocktoForm := จริง;
F1X := แบบฟอร์ม 1.ซ้าย;
F1Y := แบบฟอร์ม 1.ด้านบน;
F2X := ฟอร์ม2.ซ้าย;
F2Y := แบบฟอร์ม 2.ด้านบน;
จบ;
จบ;
จบ;
ขั้นตอน TForm1.FormMouseUp (ผู้ส่ง: TObject; ปุ่ม: TMouseButton; Shift: TShiftState; X, Y: จำนวนเต็ม);
เริ่ม
CanMove := เท็จ;
จบ;
ขั้นตอน TForm1.FormShow (ผู้ส่ง: TObject);
เริ่ม
//รับพารามิเตอร์พื้นที่ทำงาน
SystemParametersInfo (SPI_GETWORKAREA, 0, @WorkArea, 0);
Form2.แสดง;
จบ;
จบ.
แบบฟอร์ม2
หน่วย uDock;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, คลาส, กราฟิก, การควบคุม, แบบฟอร์ม, กล่องโต้ตอบ;
พิมพ์
TForm2 = คลาส (TForm)
ขั้นตอน FormMouseDown (ผู้ส่ง: TObject; ปุ่ม: TMouseButton; Shift: TShiftState; X, Y: จำนวนเต็ม);
ขั้นตอน FormMouseMove (ผู้ส่ง: TObject; Shift: TShiftState; X, Y: จำนวนเต็ม);
ขั้นตอน FormMouseUp (ผู้ส่ง: TObject; ปุ่ม: TMouseButton; Shift: TShiftState; X, Y: จำนวนเต็ม);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
{ประกาศสาธารณะ}
จบ;
var
แบบฟอร์ม 2: TForm2;
CanMove, CanMoveX, CanMoveY, DocktoForm: บูลีน;
OldX, OldY: จำนวนเต็ม;
การดำเนินการ
ใช้ uMain;
{$R *.DFM}
ขั้นตอน TForm2.FormMouseDown (ผู้ส่ง: TObject; ปุ่ม: TMouseButton; Shift: TShiftState; X, Y: จำนวนเต็ม);
เริ่ม
CanMoveX := จริง;
CanMoveY := จริง;
CanMove := จริง;
เก่าX := X;
เก่า Y := Y;
จบ;
ขั้นตอน TForm2.FormMouseMove (ผู้ส่ง: TObject; Shift: TShiftState; X, Y: จำนวนเต็ม);
เริ่ม
ถ้า (CanMove) แล้ว
เริ่ม
ถ้า CanMoveX แล้ว
Form2.Left := Form2.Left + (X - OldX);
ถ้า CanMoveY แล้ว
Form2.Top := Form2.Top + (Y - OldY);
//ส่วนนี้ล็อคไปด้านบน
ถ้า (Form2.Top < WorkArea.Top + 10) และ (Form2.Top > WorkArea.Top-10) แล้ว
เริ่ม
Form2.Top := WorkArea.Top;
ถ้า (Y-OldY > 10) หรือ (Y-OldY < -10) แล้ว
CanMoveY := จริง
อื่น
CanMoveY := เท็จ;
จบ;
//ส่วนนี้ล็อคไปทางด้านซ้าย
ถ้า (Form2.Left < WorkArea.Left+10) และ (Form2.Left > WorkArea.Left-10) แล้ว
เริ่ม
Form2.Left := WorkArea.Left;
ถ้า (X-OldX > 10) หรือ (X-OldX < -10) แล้ว
CanMoveX := จริง
อื่น
CanMoveX := เท็จ;
จบ;
// ส่วนนี้ล็อคไปทางด้านขวา
ถ้า (Form2.Left > WorkArea.Right-Form2.Width-10) และ (Form2.Left < WorkArea.Right-Form2.Width+10) แล้ว
เริ่ม
Form2.Left := WorkArea.Right-Form2.Width;
ถ้า (X-OldX > 10) หรือ (X-OldX < -10) แล้ว
CanMoveX := จริง
อื่น
CanMoveX := เท็จ;
จบ;
//ส่วนนี้เชื่อมโยงกับทาสก์บาร์
ถ้า (Form2.Top > WorkArea.Bottom-Form2.Height-10) และ (Form2.Top < WorkArea.Bottom-Form2.Height+10) แล้ว
เริ่ม
Form2.Top := WorkArea.Bottom-Form2.Height;
ถ้า (Y-OldY > 10) หรือ (Y-OldY < -10) แล้ว
CanMoveY := จริง
อื่น
CanMoveY := เท็จ;
ออก;
จบ;
//ส่วนนี้เชื่อมโยงกับส่วนด้านล่างของผู้เล่น
ถ้า (Form2.Top > Form1.Top+Form1.Height-10) และ (Form2.Top < Form1.Top+Form1.Height+10) และ (Form2.Left > Form1.Left-Form2.Width) และ (Form2. ซ้าย < Form1.Left + Form1.Width) จากนั้น
เริ่ม
Form2.Top := Form1.Top+Form1.Height;
ถ้า (Y-OldY > 10) หรือ (Y-OldY < -10) ให้เริ่ม
CanMoveY := จริง;
Form1.DockToForm := เท็จ;
จบ
เริ่มอย่างอื่น
CanMoveY := เท็จ;
Form1.DockToForm := จริง;
จบ;
จบ;
//ส่วนนี้จะล็อคเพลย์ลิสต์ไว้ตรงกลางของ Form1
ถ้า (Form2.Left > Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2))-10) และ (Form2.Left < Form1.Left + ((Form1.Width div 2)-( Form2.ความกว้าง div 2))+10) และ
(Form2.Top > Form1.Top+Form1.Height-10) และ (Form2.Top < Form1.Top+Form1.Height+10) จากนั้น
เริ่ม
Form2.Left := Form1.Left + ((Form1.Width div 2)-(Form2.Width div 2));
ถ้า (X-OldX > 10) หรือ (X-OldX < -10) หรือ (Y-OldY > 10) หรือ (Y-OldY < -10) แล้ว
CanMoveX := จริง
อื่น
CanMoveX := เท็จ;
จบ;
จบ;
จบ;
ขั้นตอน TForm2.FormMouseUp (ผู้ส่ง: TObject; ปุ่ม: TMouseButton; Shift: TShiftState; X, Y: จำนวนเต็ม);
เริ่ม
CanMove := เท็จ;
จบ;
จบ.
ฉันหวังว่าข้อมูลข้างต้นจะเป็นประโยชน์สำหรับผู้ที่กำลังดิ้นรนกับเนื้อหาที่คล้ายกัน