目录
1.UI界面
<pre name="code" class="csharp"><Window x:Class="ATMClient.GSTaskManageControl.GSTaskDrawRecTangle"
x:Name="TaskDrawRectangleWnd"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:GS_CommonUI="clr-namespace:GS_CommonUI.Controls;assembly=GS_CommonUI"
Icon="../Image/MainWnd/icon.ico"
ResizeMode="NoResize"
WindowStartupLocation="CenterScreen"
WindowStyle="None"
BorderBrush="LightGray"
BorderThickness="1"
Title="GSTaskDrawRecTangle" Height="500" Width="600">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="1*" />
<RowDefinition Height="70" />
</Grid.RowDefinitions>
<Grid Grid.Row="0" MouseLeftButtonDown="Grid_MouseLeftButtonDown">
<span style="white-space:pre"> </span></Grid>
<Grid x:Name="DrawGrid" Grid.Row="1" SizeChanged="DrawGrid_SizeChanged" Margin="0">
<DockPanel SnapsToDevicePixels="True" >
<Canvas x:Name="DrawCanvas" Cursor="Pen"
MouseLeftButtonDown="Canvas_MouseLeftButtonDown"
MouseMove="Canvas_MouseMove"
MouseLeave="DrawCanvas_MouseLeave"
MouseLeftButtonUp="Canvas_MouseLeftButtonUp">
<Canvas.Background >
<ImageBrush x:Name="DrawImage" ImageSource="{Binding}"></ImageBrush>
</Canvas.Background>
</Canvas>
</DockPanel>
</Grid>
<Grid Grid.Row="2">
</Grid>
</Grid>
</Window>
2.逻辑代码
<span style="white-space:pre"> </span>/// <summary>
/// 鼠标按下
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
DrawCanvas.Children.Clear();
m_drawFlag = true;
Rectangle rectangle = new Rectangle();
rectangle.Stroke = Brushes.Red;
rectangle.StrokeThickness = 3;
rectangle.Opacity = 1;
m_insertShape = rectangle;
m_startPosition = e.GetPosition(DrawCanvas);
Canvas.SetLeft(rectangle, e.GetPosition(DrawCanvas).X);
Canvas.SetTop(rectangle, e.GetPosition(DrawCanvas).Y);
DrawCanvas.Children.Add(m_insertShape);
return;
}
/// <summary>
/// 鼠标移动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
if (m_drawFlag && m_insertShape != null)
{
if (e.GetPosition(DrawCanvas).X > m_startPosition.X)
{
m_width = e.GetPosition(DrawCanvas).X - m_startPosition.X;
}
else
{
m_width = m_startPosition.X - e.GetPosition(DrawCanvas).X;
}
if (e.GetPosition(DrawCanvas).Y > m_startPosition.Y)
{
m_height = e.GetPosition(DrawCanvas).Y - m_startPosition.Y;
}
else
{
m_height = m_startPosition.Y - e.GetPosition(DrawCanvas).Y;
}
Point point = new Point();
if (e.GetPosition(DrawCanvas).X < e.GetPosition(DrawCanvas).Y)
{
point.X = e.GetPosition(DrawCanvas).X;
point.Y = e.GetPosition(DrawCanvas).X;
}
else
{
point.X = e.GetPosition(DrawCanvas).Y;
point.Y = e.GetPosition(DrawCanvas).Y;
}
Point clientPoint = PointToScreen(point);
int value = 0;
// 加30是因为标题高度为30,加1是因为窗口的BorderThickness为1,在设置鼠标位置的时候要精确到每一个像素
if (m_startPosition.X < m_startPosition.Y)
{
value = Convert.ToInt32(m_startPosition.Y - m_startPosition.X);
SetCursorPos(Convert.ToInt32(clientPoint.X) + 1, Convert.ToInt32(clientPoint.Y) + value + 30 + 1);
}
else
{
value = Convert.ToInt32(m_startPosition.X - m_startPosition.Y);
SetCursorPos(Convert.ToInt32(clientPoint.X) + value + 1, Convert.ToInt32(clientPoint.Y) + 30 + 1);
}
if (m_width < m_height)
{
// 边长为width
m_insertShape.Width = m_width;
m_insertShape.Height = m_width;
if (e.GetPosition(DrawCanvas).X < m_startPosition.X)
{
Canvas.SetLeft(m_insertShape, m_startPosition.X - m_width);
}
else
{
Canvas.SetRight(m_insertShape, e.GetPosition(DrawCanvas).X);
}
if (e.GetPosition(DrawCanvas).Y < m_startPosition.Y)
{
Canvas.SetTop(m_insertShape, m_startPosition.Y - m_width);
}
else
{
Canvas.SetBottom(m_insertShape, m_startPosition.Y + m_width);
}
}
else
{
// 边长为height
m_insertShape.Width = m_height;
m_insertShape.Height = m_height;
if (e.GetPosition(DrawCanvas).X < m_startPosition.X)
{
Canvas.SetLeft(m_insertShape, m_startPosition.X - m_height);
}
else
{
Canvas.SetRight(m_insertShape, m_startPosition.X + m_height);
}
if (e.GetPosition(DrawCanvas).Y < m_startPosition.Y)
{
Canvas.SetTop(m_insertShape, m_startPosition.Y - m_height);
}
else
{
Canvas.SetBottom(m_insertShape, e.GetPosition(DrawCanvas).Y);
}
}
}
return;
}
/// <summary>
/// 鼠标提起
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Canvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (m_width < m_height)
{
m_value = m_width;
}
else
{
m_value = m_height;
}
m_drawFlag = false;
return;
}
/// <summary>
/// 鼠标离开(可能未画完,但还是要保存下来)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DrawCanvas_MouseLeave(object sender, MouseEventArgs e)
{
if (!m_drawFlag)
{
return;
}
if (m_width < m_height)
{
m_value = m_width;
}
else
{
m_value = m_height;
}
m_drawFlag = false;
return;
}