一个像素输出 - OnPaint - System :: Drawing :: Rectangle rectangle = this-> ClientRectangle;

时间:2011-03-12 05:44:31

标签: .net c++ winforms visual-studio-2010

在使用OnPaint方法绘制时,我保持1像素。我不明白为什么。

但是,我不确定这是不可数的!

我已经回到了绘图板,在1个面板中有1个标签,因为我确信我正在计算这些,我有很多追踪,我一步一步地完成这些陈述,绝对检查一切。

我确实发现了一些与此无关的错误,因此显然值得这样做。

我发现以下代码确实为ClientRectangle写了一个像素边框: -

    System::Drawing::Rectangle rectangle = this->ClientRectangle;
    rectangle.Inflate(-1,-1);
    e->Graphics->DrawRectangle(blackPen, rectangle);

到目前为止一直很好,但为什么-1呢?

无论如何,当我逐步完成代码时,我的困惑就会加深。

我用以下1个像素边框填充矩形的全部内容(通过试错法和颜色编码找到2个): -

    System::Drawing::Pen^ violetPen = gcnew System::Drawing::Pen( Brushes::Violet );
    for(int y=2; y< e->ClipRectangle.Bottom-1; y++)
    {
        e->Graphics->DrawLine( violetPen, e->ClipRectangle.Left+2, y,
            this->ClientRectangle.Right-2, y);
    }

因此,ClientRectangle是可写区域,但它的索引从(1,1)开始 现在这是一个没有边框的Panel,根据MSDN,ClientRectangle如下: -

控件的客户端区域是控件的边界,减去非客户端元素,如滚动条,边框,标题栏和菜单。 因为客户端坐标是相对于控件的客户区域的左上角,所以此属性返回的矩形左上角的坐标是(0,0)。您可以使用此属性来获取控件的客户区域的大小和坐标,以便在控件的表面上绘制任务。

现在我的控件没有滚动条,边框,标题栏和菜单,所以我认为索引应该从(0,0)开始,这是我一直在计算的地方。

Panel

默认情况下会显示Panel控件,没有任何边框。

有人可以帮我理解我在这里缺少的东西吗?

1 个答案:

答案 0 :(得分:1)

嗯,你确定问题点实际上是左上角角落,而不是右下角吗?

Windows控件内部使用的RECT structure独占,这意味着坐标(右,底)的像素位于矩形的外部。

如您所示,将与客户区对应的矩形缩小1个像素,解决了这个问题。