我有一个非常简单的代码在我的用户控件上绘制网格(在调用基类OnBackgroundPaint之后):
private void DrawGrid(Graphics g)
{
Pen p = new Pen(new HatchBrush(HatchStyle.LargeGrid | HatchStyle.Percent50, Color.LightGray, Color.Transparent), 1);
for (int i = 0; i < this.Size.Width; i+=50)
{
g.DrawLine(p, new Point(i, this.Location.Y), new Point(i, this.Size.Height));
}
for (int i = 0; i < this.Size.Height; i += 50)
{
g.DrawLine(p, new Point(this.Location.X,i), new Point(this.Size.Width, i));
}
p.Dispose();
}
当我将此控件放置到主窗体并且不使用对接时,它适用于调整大小。但是,当我将Dock属性设置为None以外的任何其他内容时,在调整绘制区域后,将删除绘制区域并且不再绘制。可能是什么原因?
答案 0 :(得分:0)
这是因为你必须从0,0位置开始 当你创建用户控件而你想要专注于它时,你必须从0开始,0左上角位置没有重新分配父级用户控件
private void DrawGrid(Graphics g)
{
Pen p = new Pen(new HatchBrush(HatchStyle.LargeGrid | HatchStyle.Percent50, Color.LightGray, Color.Transparent), 1);
for (int i = 0; i < this.Size.Width; i+=50)
{
g.DrawLine(p, new Point(i, **0**), new Point(i, this.Size.Height));
}
for (int i = 0; i < this.Size.Height; i += 50)
{
g.DrawLine(p, new Point(**0**,i), new Point(this.Size.Width, i));
}
p.Dispose();
}
您还必须在控件构造函数中调用此函数:
this.SetStyle(ControlStyles.DoubleBuffer |
ControlStyles.UserPaint |
ControlStyles.AllPaintingInWmPaint,
true);
this.UpdateStyles();
这个调用告诉用户控件 绘图在缓冲区中执行,完成后,结果输出到屏幕。双缓冲可防止重绘控件造成的闪烁。如果将DoubleBuffer设置为true,则还应将UserPaint和AllPaintingInWmPaint设置为true。 控件自己绘制而不是操作系统。如果为false,则不会引发Paint事件。此样式仅适用于从Control派生的类。 和 控件忽略窗口消息WM_ERASEBKGND以减少闪烁。仅当UserPaint位设置为true时才应用此样式。
有关详细信息,您可以看到此链接:
https://msdn.microsoft.com/en-us/library/system.windows.forms.controlstyles(v=vs.110).aspx