WPF 绘正方形,设置鼠标不偏离,保持在右下角

目录

 

1.UI界面

2.逻辑代码


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;
        }

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值