首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

怎么实现按上鼠标画任意方向矩形,松开矩形框消失

2013-01-23 
如何实现按下鼠标画任意方向矩形,松开矩形框消失本帖最后由 hjx595 于 2013-01-08 14:46:58 编辑我想实现

如何实现按下鼠标画任意方向矩形,松开矩形框消失
本帖最后由 hjx595 于 2013-01-08 14:46:58 编辑 我想实现按下鼠标画任意方向矩形,松开鼠标矩形框消失,并选中框内的控件,然后按需对齐。类似VS那样。
private bool MouseIsDown = false;
        Rectangle MouseRect = Rectangle.Empty;
        Point start, end;
        Graphics g;
       private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            //MouseIsDown = false;    
            //MouseRect = Rectangle.Empty;

            MouseIsDown = false;
            g.Clear(Color.White);
            g.Dispose();
           
        }
       private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            if (MouseIsDown)
            {
                Pen pen1 = new Pen(Color.White, 1);
                pen1.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
                Pen pen2 = new Pen(Color.Black, 1);
                pen2.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;
                g.DrawRectangle(pen1, start.X, start.Y, Math.Abs(end.X - start.X), Math.Abs(end.Y - start.Y));
                end.X = e.X;
                end.Y = e.Y;
                g.DrawRectangle(pen2, start.X, start.Y, Math.Abs(end.X - start.X), Math.Abs(end.Y - start.Y));

                //end.X = e.X;
                //end.Y = e.Y;
                //Rectangle rect = this.RectangleToScreen(MouseRect);
                //ControlPaint.DrawReversibleFrame(rect, Color.White, FrameStyle.Dashed);
                //MouseRect.Width = end.X - start.X;
                //MouseRect.Height = end.Y - start.Y;
                //Rectangle rect1 = this.RectangleToScreen(MouseRect);


                //ControlPaint.DrawReversibleFrame(rect1, Color.White, FrameStyle.Dashed);
            }
        }
       private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            g = this.panel1.CreateGraphics();
            MouseIsDown = true;
            start.X = e.X;
            start.Y = e.Y;
           
            //MouseIsDown = true;
            //start.X = e.X;
            //start.Y = e.Y;
            //MouseRect = new Rectangle(start.X, start.Y, 0, 0);
        }
我这里有2种不同的方法,第一种通过画笔,矩形框可以消失,但只能往右下角绘图;第二种是用rectangle,可逆但没有消失的方法。
有没有更好的方法啊,还有松开鼠标后控件怎么选中啊? c# winform object
[解决办法]
你应该将绘图的代码写到OnPaint事件中,鼠标的位置作为公共变量,需要重绘时调用 OnPaint事件所属组件的Invalidate事件
[解决办法]
画框

private void ctrlCtnr_MouseMove(object sender, MouseEventArgs e)
        {
            Control ctrlCtnr = sender as Control;

            _MoveX = e.X;
            _MoveY = e.Y;

            if (_Draw)
            {
                //画框就是选择最小x和最小y为坐标 最大x-最小x为宽,最大y-最小y为高
                int localx = _DownX > _MoveX ? _MoveX : _DownX;
                int localy = _DownY > _MoveY ? _MoveY : _DownY;

                //打开双缓存
                BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;
                BufferedGraphics myBuffer = currentContext.Allocate(ctrlCtnr.CreateGraphics(), ctrlCtnr.DisplayRectangle);

                Graphics g = myBuffer.Graphics;
                g.Clear(Button.DefaultBackColor);



                Brush b = new SolidBrush(Color.FromArgb(100, Color.Red));
                Pen p = new Pen(b);

                //画框
                g.DrawRectangle(p, localx, localy, Math.Abs(_DownX - _MoveX), Math.Abs(_DownY - _MoveY));

                myBuffer.Render();
                myBuffer.Dispose();
            }
        }



MouseUp 的时候看看控件是不是在框里,在就选择,不在就不选择,最后执行该控件的Invalidate();

可以这样判断控件在不在框里
画框.IntersectsWith(控件自己的框)

热点排行