1

我正在尝试以窗口形式绘制不同的形状,就像我们在油漆中绘制一样。我想要这样的场景,比如用户单击矩形按钮,然后在应该绘制的表单上绘制一个矩形,绘制手绘形状的情况也是如此。以下是我的代码:

    {
        bool shouldPaint = false;
        int initialX;
        int initialY;
        bool rectButton = false;
        bool freeButton = false;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            shouldPaint = true;
            initialX = e.X;
            initialY = e.Y;
        }

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            shouldPaint = false;
        }
        if ( (rectButton==true) && (shouldPaint))
            {
                //
                this.Invalidate();
              this.Refresh();
                System.Drawing.Pen pen1 = new          System.Drawing.Pen(System.Drawing.Color.Black);
                Graphics painter = CreateGraphics();
int width = e.X - initialX, height = e.Y - initialY;
                Rectangle rect = new Rectangle(initialX, initialY, width * Math.Sign(width), height * Math.Sign(height));
                painter.DrawRectangle(pen1, rect);


            }
            else if ((freeButton == true) && (shouldPaint))
            {
                //this.Refresh();
              //  this.Invalidate();
                Graphics painter = CreateGraphics();

                painter.FillEllipse(new SolidBrush(Color.Black), e.X, e.Y, 4, 4);

我面临两个问题;第一个是我能够向前绘制我的矩形,但是当我尝试向后绘制它时它不起作用。其次,当我单击手绘按钮时,它会在表单上以手绘形状绘制,但是当我第一次单击矩形按钮然后单击手绘按钮时,它不会绘制任何手绘形状。我是初学者,所以请温柔并帮助我:)

4

1 回答 1

0

不要发送 initialX 和 initialY 作为 nstarting 坐标,而是发送:

int minX = Math.Min((int)initX, (int)e.X);
 int minY = Math.Min((int)initY, (int)e.Y);
Rectangle rect = new Rectangle(minX,minY width * Math.Sign(width), height * Math.Sign(height));
于 2017-09-15T22:41:55.760 回答