所以我试图制作一个漂亮的圆形开关,当它点击时它会向左或向右滑动以基本上打开或关闭某些东西(它可以用于其他东西)。我有一个矩形版本工作有点好(我有一些调整,我想为它做的)但我遇到的问题是使用圆角矩形。我做了几节课来帮助我自己。我有一个叫RoundRectanglePath。使用Create方法我给它一个Rectangle(或x,y,w,h)和一个角的半径,它返回一个闭合的GraphicsPath,然后我可以使用Graphics。[Fill | Draw] Path with。然后我有一个RoundRectangle类,它只是一个与Label非常相似的控件。我发现,如果我覆盖OnPaintBackground并且不将事件发送到基础,而是绘制一个与它的Parent.BackColor相同颜色的矩形,而不是我得到控件真的是圆形的错觉。 (作为相关的附注,我允许透明)
对于我的RoundMovableSwitch类,我使用2个RoundRectanglePaths将Control拆分为一半。左边是绿色,右边是粉红色(想想它现在我可以使用一个水平的LinearGradient画笔......哎呀哦)然后我在对面画出字符串On和Off。对于该控件,我添加了一个RoundRectangle。当用户单击RoundRectangle或MoveableSwitch时,Control会一次向左或向右移动RoundRectangle 1个像素。运动很棒。我遇到的问题是这个。 RoundRectangle的外边缘是正确的透明颜色。内边缘是错误的颜色。请参见下图中的RoundMovingSwitch 1和2。一旦我使代码正常工作,我将返回并重新组织代码。
代码托管在GitHub上:Here
答案 0 :(得分:2)
“我遇到的问题是这个.RoundRectangle的外边缘是正确的透明颜色。内边缘是错误的颜色。”
不确定我理解这个问题......
您是否想要摆脱圆边之外的蓝色角落?
如果是这样,那么在RoundRectangle中尝试:
public RoundRectangle()
{
this.ResizeRedraw = true;
this.VisibleChanged += new EventHandler(RoundRectangle_VisibleChanged);
}
private bool RegionSet = false;
void RoundRectangle_VisibleChanged(object sender, EventArgs e)
{
if (this.Visible && !RegionSet)
{
RegionSet = true;
var r = new RectangleEx(this.ClientRectangle);
var path = RoundRectanglePath.Create(r.ToRectangle(), this.Radius, this.Corners);
this.Region = new Region(path);
}
}
*如果控件的大小发生变化,则应将Region()属性重置为新大小。
编辑:在尺寸改变时重置区域:
protected override void OnSizeChanged(EventArgs e)
{
base.OnSizeChanged(e);
var r = new RectangleEx(this.ClientRectangle);
var path = RoundRectanglePath.Create(r.ToRectangle(), this.Radius, this.Corners);
this.Region = new Region(path);
}