所以我在.NET 2.0中创建了一个自定义用户控件,这个用户控件基本上是一个组合的用户控件(它上面有一个带标签的图片)。它的功能基本上就像按钮一样,可以点击等。
现在我遇到的问题是无论出于何种原因边框样式都不支持3d边框......
因此,当按钮未被取消时,它应具有Border3dStyle.Raised外观。然后当它被按下时,它应该具有Border3dStyle.Sunken外观。
我通过覆盖OnPaint方法获得了Border3dStyle.Raised。像这样......
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);
}
如何在触发click事件时调用UserInkControl_Paint?
答案 0 :(得分:1)
Click
事件不适用于您尝试执行的操作,因为只有在按住鼠标按钮然后释放鼠标按钮后才会调用该特定事件。您应该使用MouseDown
事件将布尔属性(例如_isDown
)设置为true
,然后调用.Refresh()
;使用MouseUp
事件设置_isDown = false;
,然后只需拨打.Refresh()
。
在Paint
事件中,检查_isDown
属性并使用适当的参数调用DrawBorder3D
方法。
答案 1 :(得分:0)
你可以调用“myControl.Refresh()”。它将重绘整个控件。
答案 2 :(得分:0)
您正在寻找Invalidate
method。
答案 3 :(得分:0)
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.
}