2011-08-17 5 views
1

이미지가있는 캔버스가 있습니다. 마우스 (드래그 앤 드롭)를 사용하여 이미지를 이동할 수 있습니다. 사용자가 캔버스 외부로 이미지를 이동하지 못하도록하고 싶습니다.WPF의 트랩 마우스

캔버스 내부에서만 움직일 수 있도록 마우스 포인터를 잡을 수있는 방법이 있습니까? 따라서 사용자가 캔버스 외부로 마우스를 이동하려고하면 커서가 캔버스의 가장자리에 남습니다.

이 동작의 한 예는 창을 이동할 때 작업 표시 줄에서 이동할 수없는 경우입니다. 작업 표시 줄에서 이동하려고하면 마우스 커서가 작업 표시 줄의 가장자리에 있으며 작업 표시 줄 맨 위로 이동하지 못합니다.

답변

3

더 많은 검색을 한 후, 나는 정확히 내가 원하는 것을 수행하는 clipCursor라는 함수가 user32.dll에 있음을 발견했습니다.

다음은 마우스 커서를 트래핑하는 샘플 앱의 예입니다. Button1을 클릭하면 커서가 (10,10500,500)에 사각형으로 구속됩니다. Button2 (또는 응용 프로그램 닫기)를 누르면 커서가 다시 해제됩니다.

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.X + this.Width), (int) (targetLoc.Y + this) . Height));' – StinkyCat

5

잘 작동하는 응용 프로그램은 마우스 포인터의 움직임을 제한해서는 안됩니다. 그것은 사용자이고 응용 프로그램이 아니라 마우스 포인터가 윈도우를 끌 때 작업 표시 줄 위로 이동할 수없는 위치를 묘사하는 동작은 내가 경험 한 것이 아닙니다.

그러나 사용자가 캔버스에서 이미지를 드래그하면 이미지 이동을 제한 할 수 있으므로 사용자가 마우스 포인터를 캔버스 외부로 움직여도 이미지가 캔버스 내부에 남아있게됩니다.

Windows에서 드래그 작업을 수행 할 때는 보통 capture the mouse입니다. 즉, 응용 프로그램 창 밖으로 이동해도 응용 프로그램이 마우스 포인터의 이동에 대한 정보를 계속 수신합니다.

관련 문제