使用Dock调整用户控件的大小后,绘图不起作用

时间:2018-01-14 10:52:44

标签: c# winforms user-controls drawing

我有一个非常简单的代码在我的用户控件上绘制网格(在调用基类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以外的任何其他内容时,在调整绘制区域后,将删除绘制区域并且不再绘制。可能是什么原因?

1 个答案:

答案 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