C# 正在调用“在按钮上绘制”单击

C# 正在调用“在按钮上绘制”单击,c#,.net,winforms,user-controls,C#,.net,Winforms,User Controls,所以我在.NET2.0中创建了一个自定义用户控件,这个用户控件基本上是一个组合用户控件(上面有一个带有标签的图片)。它的功能基本上就像一个按钮,可以点击等等 现在的问题是,无论出于什么原因,边框样式都不支持3d边框 因此,当按钮松开时,它应该具有Border3dStyle.凸起的外观。然后,当它被按下时,它应该具有Border3dStyle.凹陷的外观 我通过重写OnPaint方法获得了Border3dStyle。就像这样 protected override void OnPaint(

所以我在.NET2.0中创建了一个自定义用户控件,这个用户控件基本上是一个组合用户控件(上面有一个带有标签的图片)。它的功能基本上就像一个按钮,可以点击等等

现在的问题是,无论出于什么原因,边框样式都不支持3d边框

因此,当按钮松开时,它应该具有Border3dStyle.凸起的外观。然后,当它被按下时,它应该具有Border3dStyle.凹陷的外观

我通过重写OnPaint方法获得了Border3dStyle。就像这样

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        ControlPaint.DrawBorder3D(e.Graphics, this.ClientRectangle, Border3DStyle.Raised);
    }
我还有另外一种方法,我想在点击按钮时调用,这就是我认为可能会起作用的方法

        private void UserInkControl_Paint(object sender, PaintEventArgs e)
    {
        Rectangle borderRectangle = this.ClientRectangle;
        ControlPaint.DrawBorder3D(e.Graphics, borderRectangle, Border3DStyle.Sunken);
    }
我在加载事件中注册了它

        private void UserInkControl_Load(object sender, EventArgs e)
    {
        this.Paint += new System.Windows.Forms.PaintEventHandler(this.UserInkControl_Paint);
    }

当单击事件被触发时,如何调用UserInkControl\u Paint?

您可以调用“myControl.Refresh()”。它将重新绘制整个控件。

您正在查找。

对于您尝试执行的操作,
单击事件将不起作用,因为该特定事件只有在按住鼠标按钮然后释放后才会调用。您应该使用
MouseDown
事件将布尔属性(例如,
\u isDown
)设置为
true
,然后调用
.Refresh()
;使用
MouseUp
事件设置
\u isDown=false
,然后也只需调用
.Refresh()


Paint
事件中,检查
\u isDown
属性,并使用适当的参数调用
DrawBorder3D
方法。

刷新意味着无效和更新。Invalidate Invalidate和Update重画无效区域。假设他只在“Draw”方法中绘制所需区域,则只重画该区域。
public void UserInkControl_Click(object sender, EventArgs ea)
{
   UserInkControl.Refresh ();  // Causes repainting immediately
   // or
   UserInkControl.Invalidate ();  // Invalidates the whole painting surface, 
   //so when the message loop catches up, it gets repainted.
   // There is also an overload of Invalidate that
   // lets you invalidate a particular part of the button,
   // So only this area is redrawn.  This can reduce flicker.
}