为什么不用鼠标在新的透明窗体上绘制矩形?

时间:2018-07-23 22:10:38

标签: c# winforms

正在进入F_Paint事件,但没有进入F_MouseDown事件。 我希望能够在F表单上绘制矩形。

也许F表单是透明的,所以不能在它上面绘制吗?但是我从来没有在F_MouseDown事件中使用断点来进入F_MouseDown事件。

不确定为什么没有参加MouseDown事件。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Tester
{
    public partial class Form1 : Form
    {
        Ffmpeg ffmpeg = new Ffmpeg();

        private bool _canDraw;
        private int _startX, _startY;
        private Rectangle _rect;

        public Form1()
        {
            InitializeComponent();

            BackColor = Color.Blue;
            TransparencyKey = BackColor;
            Opacity = 1;
            var f = new HelperForm { Opacity = 0, ShowInTaskbar = false, FormBorderStyle = FormBorderStyle.None };
            f.MouseDown += F_MouseDown;
            f.MouseMove += F_MouseMove;
            f.MouseUp += F_MouseUp;
            f.Paint += F_Paint;
            f.Show();
            Visible = false;
            Owner = f;
            Visible = true;
            Move += (o, a) => f.Bounds = Bounds;
            Resize += (o, a) => f.Bounds = Bounds;
            f.Bounds = Bounds;
            ffmpeg.Start(@"d:\ffmpegx86\test.mp4", 24);
        }

        private void F_Paint(object sender, PaintEventArgs e)
        {
            //Create a new 'pen' to draw our rectangle with, give it the color red and a width of 2
            using (Pen pen = new Pen(Color.Red, 2))
            {
                //Draw the rectangle on our form with the pen
                e.Graphics.DrawRectangle(pen, _rect);
            }
        }

        private void F_MouseUp(object sender, MouseEventArgs e)
        {
            //The system is no longer allowed to draw rectangles
            _canDraw = false;
        }

        private void F_MouseMove(object sender, MouseEventArgs e)
        {
            //If we are not allowed to draw, simply return and disregard the rest of the code
            if (!_canDraw) return;

            //The x-value of our rectangle should be the minimum between the start x-value and the current x-position
            int x = Math.Min(_startX, e.X);
            //The y-value of our rectangle should also be the minimum between the start y-value and current y-value
            int y = Math.Min(_startY, e.Y);

            //The width of our rectangle should be the maximum between the start x-position and current x-position minus
            //the minimum of start x-position and current x-position
            int width = Math.Max(_startX, e.X) - Math.Min(_startX, e.X);

            //For the hight value, it's basically the same thing as above, but now with the y-values:
            int height = Math.Max(_startY, e.Y) - Math.Min(_startY, e.Y);
            _rect = new Rectangle(x, y, width, height);
            //Refresh the form and draw the rectangle
            Refresh();
        }

        private void F_MouseDown(object sender, MouseEventArgs e)
        {
            //The system is now allowed to draw rectangles
            _canDraw = true;
            //Initialize and keep track of the start position
            _startX = e.X;
            _startY = e.Y;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            ffmpeg.Close();
        }
    }

    class HelperForm : Form
    {
        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_EX_TOOLWINDOW = 0x80;
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= WS_EX_TOOLWINDOW;
                return cp;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

有几个原因阻止绘制矩形并触发鼠标事件。首先,将Opacity设置为0;这意味着您尝试绘制的任何内容都将永远不可见。相反,您应该将TransparencyKey设置为BackColor中的颜色:

f.TransparencyKey = f.BackColor;

然后,您尝试使用从未初始化的对象_rect绘制矩形;因此,您要绘制的矩形将以0宽度和0高度的大小绘制,这意味着将不会绘制它,因此,在初始化期间,应为_rect提供默认值,例如:

_rect = new Rectangle(Point.Empty, this.Size);

绘制的矩形现在应该可见;但是,事件不会触发,因为您正在反转表单所有权,因此,代替

Owner = f;

使用:

f.Owner = this;