2009-12-11 34 views
1

我想限制窗體可以移動到桌面的位置。基本上我不希望他們能夠將表格從桌面上移開。我發現了一堆SetBounds函數,但它們似乎對我的函數名稱看起來很奇怪,並沒有達到我的目的。C#想要限制窗體可以移動到的位置

回答

1

只是處理Move事件,或覆蓋OnMove,以確保窗口是在桌面上:

protected override OnMove(EventArgs e) 
{ 
    if (Screen.PrimaryScreen.WorkingArea.Contains(this.Location)) 
    { 
     this.Location = Screen.PrimaryScreen.WorkingArea.Location; 
    } 
} 
0

我只是做了和OnLocationChanged的覆蓋。這很粗糙,但工作,我只有一天,才能找到一個修復,所以我完成了。表單的長度和寬度是544和312. OnMove和OnLocationChanged有什麼區別?

protected override void OnLocationChanged(EventArgs e) 
    { 
     if (this.Location.X > Screen.PrimaryScreen.WorkingArea.X + Screen.PrimaryScreen.WorkingArea.Width - 544) 
     { 
      this.SetBounds(0, 0, 544, 312); 
     } 
     else if(this.Location.X < Screen.PrimaryScreen.WorkingArea.X) 
     { 
      this.SetBounds(0, 0, 544, 312); 
     } 
     if (this.Location.Y > Screen.PrimaryScreen.WorkingArea.Y + Screen.PrimaryScreen.WorkingArea.Height - 312) 
     { 
      this.SetBounds(0, 0, 544, 312); 
     } 
     else if (this.Location.Y < Screen.PrimaryScreen.WorkingArea.Y) 
     { 
      this.SetBounds(0, 0, 544, 312); 
     } 
    } 
5

我意識到你對答案不再感興趣,反正我會發布解決方案。您想要處理WM_MOVING消息並覆蓋目標位置。請注意,它在Win7上有副作用,如果用戶有多個顯示器,則不適用。鼠標位置處理也不是很好。代碼:

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace WindowsFormsApplication1 { 
    public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 
    protected override void WndProc(ref Message m) { 
     if (m.Msg == 0x216) { // Trap WM_MOVING 
     RECT rc = (RECT)Marshal.PtrToStructure(m.LParam, typeof(RECT)); 
     Screen scr = Screen.FromRectangle(Rectangle.FromLTRB(rc.left, rc.top, rc.right, rc.bottom)); 
     if (rc.left < scr.WorkingArea.Left) {rc.left = scr.WorkingArea.Left; rc.right = rc.left + this.Width; } 
     if (rc.top < scr.WorkingArea.Top) { rc.top = scr.WorkingArea.Top; rc.bottom = rc.top + this.Height; } 
     if (rc.right > scr.WorkingArea.Right) { rc.right = scr.WorkingArea.Right; rc.left = rc.right - this.Width; } 
     if (rc.bottom > scr.WorkingArea.Bottom) { rc.bottom = scr.WorkingArea.Bottom; rc.top = rc.bottom - this.Height; } 
     Marshal.StructureToPtr(rc, m.LParam, false); 
     } 
     base.WndProc(ref m); 
    } 
    private struct RECT { 
     public int left; 
     public int top; 
     public int right; 
     public int bottom; 
    } 
    } 
} 
相關問題