2011-08-17 76 views
1

我有一個畫布,我有一個圖像。我可以使用鼠標移動該圖像(拖放)。我想阻止用戶移動畫布外的圖像。WPF中的陷阱鼠標

有什麼辦法可以捕捉鼠標指針,因此它只能在畫布內移動?所以當用戶試圖將鼠標移動到畫布外時,光標將保持在畫布的邊緣。

此行爲的一個示例是移動窗口時,無法將其移動到任務欄上。當您嘗試在任務欄上移動它時,鼠標光標停留在任務欄的邊緣,拒絕在任務欄上移動。

回答

3

經過更多搜索後,我發現user32.dll中有一個名爲ClipCursor的函數,它完全符合我的需求。

以下是捕獲鼠標光標的示例應用程序示例。單擊Button1時,光標將被限制在一個矩形中(10,10,500,500)。當按下按鈕2(或關閉應用程序)時,光標將再次釋放。

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" /> 
     <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="12,41,0,0" Name="button2" VerticalAlignment="Top" Width="75" Click="button2_Click" /> 
    </Grid> 
</Window> 

CS:

[DllImport("user32.dll")] 
static extern void ClipCursor(ref System.Drawing.Rectangle rect); 

[DllImport("user32.dll")] 
static extern void ClipCursor(IntPtr rect); 

public MainWindow() 
{ 
    InitializeComponent(); 
} 

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
    System.Drawing.Rectangle r = new System.Drawing.Rectangle(10, 10, 500, 500); 
    ClipCursor(ref r); 
} 

private void button2_Click(object sender, RoutedEventArgs e) 
{ 
    ClipCursor(IntPtr.Zero); 
} 
+0

這一個是一個不錯的選擇,除了剪輯矩形的座標是相對於整個屏幕。把它限制在控制極限是很好的。 – StinkyCat

+0

對於任何想在控件上捕捉鼠標的人,請使用給定的解決方案加上[本文的第二個答案](http://stackoverflow.com/questions/4492734/getting-the-top-left-coordinates-of-a- wpf-uielement):'Point targetLoc = this.PointToScreen(new Point(0,0)); System.Drawing.Rectangle r = new System.Drawing.Rectangle((int)targetLoc.X,(int)targetLoc.Y,(int)(targetLoc.X + this.Width),(int)(targetLoc.Y + this .Height));' – StinkyCat

5

行爲良好的應用程序不應該試圖限制鼠標指針的移動。這是用戶,而不是你的應用程序在控制中,以及你描述的行爲,當拖動窗口時,鼠標指針不能在任務欄上移動,這並不是我所經歷的。

但是,當用戶在畫布中拖動圖像時,即使用戶將鼠標指針移到畫布外部,也可以限制圖像的移動,使其保持在畫布內。

在Windows中進行拖動操作時,通常是capture the mouse。這意味着即使應用程序移出應用程序窗口,您的應用程序也會不斷接收有關鼠標指針移動的信息。