【问题标题】:One pixel out - OnPaint - System::Drawing::Rectangle rectangle = this->ClientRectangle;一个像素输出 - OnPaint - System::Drawing::Rectangle rectangle = this->ClientRectangle;
【发布时间】:2011-07-13 22:38:02
【问题描述】:

在 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) 开始。
现在这是一个没有边框的面板,根据 MSDN,ClientRectangle 如下:-

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

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

还有一个Panel

面板控件默认显示为无边框。

有人可以帮我理解我在这里缺少什么吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 很多GDI操作都是这样的。例如 MoveTo(0,0); LineTo(5,0) 填充像素 (0,0),(1,0),...,(4.0)。它不会填充 (5,0)。
    • @David:是的,确实如此。我心中的问题是 .NET Framework 在返回 Rectangle 结构之前是否在内部执行了 Inflate(-1,-1) 操作。有时像这样的小事情被优雅地处理,有时抽象泄漏。
    • 既然预计 WinForms 的用户将能够访问像 GDI 这样的较低级别的 Win32 API,那么我认为正确的决定是让“抽象泄漏”。如果他们没有这样做,那么您的代码将不得不永远在一个抽象和另一个抽象之间切换。灾难的秘诀!
    • @David,我的困惑是我无法写入 ClientRectangle 的点 (0,0)。我确实有计数问题,并且知道(H,W)在该区域之外。但是,我可以写的最后一点是(H-2,W-2)。有一个我无法写入的像素边框不应该存在。
    猜你喜欢
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多