C# WinForm中自定义了一个控件,在Form中放了一个button,如何实现按下button之后,让自定义的控件响应?

时间:2022-11-09 16:43:18
C# WinForm中自定义了一个控件,在Form中放了一个button,如何实现按下button之后,让自定义的控件响应button事件进行缩放?

18 个解决方案

#1


code please

#2


顶下,等解答

#3


引用 1 楼 hwenycocodq520 的回复:
code please



    protected Graphics graphics;
    protected float m_Scale = 1F;

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT 

            return cp;
        }
    }
    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        // Don't paint background
    }


    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        this.graphics = e.Graphics;
        this.graphics.Clear(this.BackColor);
         OnDraw();
    }
这是自定义控件的代码,有好的解决办法没?

#4


你缩放的要求具体是什么?要不要随着窗口大小缩放,这样winform下面用panel来搞了。让你的控件填充panel控制panel试下

#5


引用 4 楼 u011130289 的回复:
你缩放的要求具体是什么?要不要随着窗口大小缩放,这样winform下面用panel来搞了。让你的控件填充panel控制panel试下



只是缩放控件,窗口大小不变。

#6


你是想说点击这个自定义控件是按钮会缩放?
还是说点另外一个按钮这个自定义控件会缩放?

前者你可以在自定义控件重载OnMouseDown  OnMouseUp
后者你可以在自定义控件中定义一个缩放函数,让button click事件调用

#7


你是想说点击这个自定义控件时它会缩放?
还是说点另外一个按钮这个自定义控件会缩放?

前者你可以在自定义控件重载OnMouseDown  OnMouseUp
后者你可以在自定义控件中定义一个缩放函数,让button click事件调用 

#8


引用 7 楼 hwenycocodq520 的回复:
你是想说点击这个自定义控件时它会缩放?
还是说点另外一个按钮这个自定义控件会缩放?

前者你可以在自定义控件重载OnMouseDown  OnMouseUp
后者你可以在自定义控件中定义一个缩放函数,让button click事件调用 



是后者!

#9


引用 7 楼 hwenycocodq520 的回复:
你是想说点击这个自定义控件时它会缩放?
还是说点另外一个按钮这个自定义控件会缩放?

前者你可以在自定义控件重载OnMouseDown  OnMouseUp
后者你可以在自定义控件中定义一个缩放函数,让button click事件调用 



这个页面有很多这种自定义的控件,调用的时候不能一个一个调用缩放函数吧?

#10


   OnDraw();是你实现缩放的函数是吧?

如果是这样:
   你在button事件中调用 自定义控件的.Invalidate()函数使控件区域无效导致重新绘制;

#11


引用 9 楼 liulu132 的回复:
Quote: 引用 7 楼 hwenycocodq520 的回复:

你是想说点击这个自定义控件时它会缩放?
还是说点另外一个按钮这个自定义控件会缩放?

前者你可以在自定义控件重载OnMouseDown  OnMouseUp
后者你可以在自定义控件中定义一个缩放函数,让button click事件调用 



这个页面有很多这种自定义的控件,调用的时候不能一个一个调用缩放函数吧?


你可以定义一个自定义控件管理类 CustomerControlManager  在里面定义Add Remove什么的,再定义一个Update函数里面就遍历所有自定义控件的Invalidate();

#12


因为你发的代码有限,所以很多情况都是我猜测的,你可以发相对完整的代码上来,比如调用方的

#13


引用 12 楼 hwenycocodq520 的回复:
因为你发的代码有限,所以很多情况都是我猜测的,你可以发相对完整的代码上来,比如调用方的



这是一个抽象函数,具体实现在子类中,抽象类:
abstract public class DrawingArea : Panel
{
  protected Graphics graphics;
    protected float m_Scale = 1F;

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT 

            return cp;
        }
    }
    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        // Don't paint background
    }


    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        this.graphics = e.Graphics;
        this.graphics.Clear(this.BackColor);
         OnDraw();
    }
}

其中一个子类:
 class BianJingDian : DrawingArea
    {
        private float m_Scale = 0.1F;
        protected override void OnDraw()
        {
            System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Yellow);          
            //绘制阀门下半部分
            this.graphics.DrawLine(pen, 0, 0, 20, 20);
            this.graphics.DrawLine(pen, 0, 0, 40, 0);
            this.graphics.DrawLine(pen, 20, 20, 40, 0);               
            //颜色填充
            Point[] pntArr = new Point[3];
            pntArr[0] = new Point(0, 0);
            pntArr[1] = new Point(40, 0);
            pntArr[2] = new Point(20, 20);
            System.Drawing.Drawing2D.GraphicsPath path = new        System.Drawing.Drawing2D.GraphicsPath();
            this.graphics.ScaleTransform(this.m_Scale, this.m_Scale, MatrixOrder.Prepend);
            path.AddLines(pntArr);
            this.graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            this.graphics.FillPath(Brushes.Yellow, path);
           this.graphics.ScaleTransform(this.m_Scale, this.m_Scale, MatrixOrder.Append);
        }
    }
缩放参数是m_Scale,具体缩放在子类中实现,只需想办法改变m_Scale就可以。

#14


OK,我知道你想要实现的了
你不应该在子类再定义一个m_Scale,共享父类的就OK了,

这样修改:
在父类DrawingArea中定义一个属性:

public float Scale
{
    get{return m_Scale;}
    set
    {
        if(value!=m_Scale)
        {
            m_Scale=value;
            this.Invalidate();
        }
    }
}

把子类的m_Scale变量删了

在调用方调用这个属性设置值就可以了

#15


引用 14 楼 hwenycocodq520 的回复:
OK,我知道你想要实现的了
你不应该在子类再定义一个m_Scale,共享父类的就OK了,

这样修改:
在父类DrawingArea中定义一个属性:

public float Scale
{
    get{return m_Scale;}
    set
    {
        if(value!=m_Scale)
        {
            m_Scale=value;
            this.Invalidate();
        }
    }
}

把子类的m_Scale变量删了

在调用方调用这个属性设置值就可以了


还有一个问题,就是一个Form中这么多控件要一个个调用吗?
C# WinForm中自定义了一个控件,在Form中放了一个button,如何实现按下button之后,让自定义的控件响应?

#16


引用 15 楼 liulu132 的回复:
Quote: 引用 14 楼 hwenycocodq520 的回复:

OK,我知道你想要实现的了
你不应该在子类再定义一个m_Scale,共享父类的就OK了,

这样修改:
在父类DrawingArea中定义一个属性:

public float Scale
{
    get{return m_Scale;}
    set
    {
        if(value!=m_Scale)
        {
            m_Scale=value;
            this.Invalidate();
        }
    }
}

把子类的m_Scale变量删了

在调用方调用这个属性设置值就可以了


还有一个问题,就是一个Form中这么多控件要一个个调用吗?
C# WinForm中自定义了一个控件,在Form中放了一个button,如何实现按下button之后,让自定义的控件响应?


11楼已经有一个解决方法,最简单的就是你把这些控件集合在list当中,遍历这个list执行更新

#17


哈哈,你做这个是什么东西啊?游戏么?

#18


引用 17 楼 hwenycocodq520 的回复:
哈哈,你做这个是什么东西啊?游戏么?


不是,做一个暖气管道的路线图。

#1


code please

#2


顶下,等解答

#3


引用 1 楼 hwenycocodq520 的回复:
code please



    protected Graphics graphics;
    protected float m_Scale = 1F;

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT 

            return cp;
        }
    }
    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        // Don't paint background
    }


    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        this.graphics = e.Graphics;
        this.graphics.Clear(this.BackColor);
         OnDraw();
    }
这是自定义控件的代码,有好的解决办法没?

#4


你缩放的要求具体是什么?要不要随着窗口大小缩放,这样winform下面用panel来搞了。让你的控件填充panel控制panel试下

#5


引用 4 楼 u011130289 的回复:
你缩放的要求具体是什么?要不要随着窗口大小缩放,这样winform下面用panel来搞了。让你的控件填充panel控制panel试下



只是缩放控件,窗口大小不变。

#6


你是想说点击这个自定义控件是按钮会缩放?
还是说点另外一个按钮这个自定义控件会缩放?

前者你可以在自定义控件重载OnMouseDown  OnMouseUp
后者你可以在自定义控件中定义一个缩放函数,让button click事件调用

#7


你是想说点击这个自定义控件时它会缩放?
还是说点另外一个按钮这个自定义控件会缩放?

前者你可以在自定义控件重载OnMouseDown  OnMouseUp
后者你可以在自定义控件中定义一个缩放函数,让button click事件调用 

#8


引用 7 楼 hwenycocodq520 的回复:
你是想说点击这个自定义控件时它会缩放?
还是说点另外一个按钮这个自定义控件会缩放?

前者你可以在自定义控件重载OnMouseDown  OnMouseUp
后者你可以在自定义控件中定义一个缩放函数,让button click事件调用 



是后者!

#9


引用 7 楼 hwenycocodq520 的回复:
你是想说点击这个自定义控件时它会缩放?
还是说点另外一个按钮这个自定义控件会缩放?

前者你可以在自定义控件重载OnMouseDown  OnMouseUp
后者你可以在自定义控件中定义一个缩放函数,让button click事件调用 



这个页面有很多这种自定义的控件,调用的时候不能一个一个调用缩放函数吧?

#10


   OnDraw();是你实现缩放的函数是吧?

如果是这样:
   你在button事件中调用 自定义控件的.Invalidate()函数使控件区域无效导致重新绘制;

#11


引用 9 楼 liulu132 的回复:
Quote: 引用 7 楼 hwenycocodq520 的回复:

你是想说点击这个自定义控件时它会缩放?
还是说点另外一个按钮这个自定义控件会缩放?

前者你可以在自定义控件重载OnMouseDown  OnMouseUp
后者你可以在自定义控件中定义一个缩放函数,让button click事件调用 



这个页面有很多这种自定义的控件,调用的时候不能一个一个调用缩放函数吧?


你可以定义一个自定义控件管理类 CustomerControlManager  在里面定义Add Remove什么的,再定义一个Update函数里面就遍历所有自定义控件的Invalidate();

#12


因为你发的代码有限,所以很多情况都是我猜测的,你可以发相对完整的代码上来,比如调用方的

#13


引用 12 楼 hwenycocodq520 的回复:
因为你发的代码有限,所以很多情况都是我猜测的,你可以发相对完整的代码上来,比如调用方的



这是一个抽象函数,具体实现在子类中,抽象类:
abstract public class DrawingArea : Panel
{
  protected Graphics graphics;
    protected float m_Scale = 1F;

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x00000020; //WS_EX_TRANSPARENT 

            return cp;
        }
    }
    protected override void OnPaintBackground(PaintEventArgs pevent)
    {
        // Don't paint background
    }


    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        this.graphics = e.Graphics;
        this.graphics.Clear(this.BackColor);
         OnDraw();
    }
}

其中一个子类:
 class BianJingDian : DrawingArea
    {
        private float m_Scale = 0.1F;
        protected override void OnDraw()
        {
            System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Yellow);          
            //绘制阀门下半部分
            this.graphics.DrawLine(pen, 0, 0, 20, 20);
            this.graphics.DrawLine(pen, 0, 0, 40, 0);
            this.graphics.DrawLine(pen, 20, 20, 40, 0);               
            //颜色填充
            Point[] pntArr = new Point[3];
            pntArr[0] = new Point(0, 0);
            pntArr[1] = new Point(40, 0);
            pntArr[2] = new Point(20, 20);
            System.Drawing.Drawing2D.GraphicsPath path = new        System.Drawing.Drawing2D.GraphicsPath();
            this.graphics.ScaleTransform(this.m_Scale, this.m_Scale, MatrixOrder.Prepend);
            path.AddLines(pntArr);
            this.graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            this.graphics.FillPath(Brushes.Yellow, path);
           this.graphics.ScaleTransform(this.m_Scale, this.m_Scale, MatrixOrder.Append);
        }
    }
缩放参数是m_Scale,具体缩放在子类中实现,只需想办法改变m_Scale就可以。

#14


OK,我知道你想要实现的了
你不应该在子类再定义一个m_Scale,共享父类的就OK了,

这样修改:
在父类DrawingArea中定义一个属性:

public float Scale
{
    get{return m_Scale;}
    set
    {
        if(value!=m_Scale)
        {
            m_Scale=value;
            this.Invalidate();
        }
    }
}

把子类的m_Scale变量删了

在调用方调用这个属性设置值就可以了

#15


引用 14 楼 hwenycocodq520 的回复:
OK,我知道你想要实现的了
你不应该在子类再定义一个m_Scale,共享父类的就OK了,

这样修改:
在父类DrawingArea中定义一个属性:

public float Scale
{
    get{return m_Scale;}
    set
    {
        if(value!=m_Scale)
        {
            m_Scale=value;
            this.Invalidate();
        }
    }
}

把子类的m_Scale变量删了

在调用方调用这个属性设置值就可以了


还有一个问题,就是一个Form中这么多控件要一个个调用吗?
C# WinForm中自定义了一个控件,在Form中放了一个button,如何实现按下button之后,让自定义的控件响应?

#16


引用 15 楼 liulu132 的回复:
Quote: 引用 14 楼 hwenycocodq520 的回复:

OK,我知道你想要实现的了
你不应该在子类再定义一个m_Scale,共享父类的就OK了,

这样修改:
在父类DrawingArea中定义一个属性:

public float Scale
{
    get{return m_Scale;}
    set
    {
        if(value!=m_Scale)
        {
            m_Scale=value;
            this.Invalidate();
        }
    }
}

把子类的m_Scale变量删了

在调用方调用这个属性设置值就可以了


还有一个问题,就是一个Form中这么多控件要一个个调用吗?
C# WinForm中自定义了一个控件,在Form中放了一个button,如何实现按下button之后,让自定义的控件响应?


11楼已经有一个解决方法,最简单的就是你把这些控件集合在list当中,遍历这个list执行更新

#17


哈哈,你做这个是什么东西啊?游戏么?

#18


引用 17 楼 hwenycocodq520 的回复:
哈哈,你做这个是什么东西啊?游戏么?


不是,做一个暖气管道的路线图。