Один пиксель на выходе - OnPaint - System :: Drawing :: Rectangle rectangle = this-> ClientRectangle; - PullRequest
1 голос
/ 12 марта 2011

Я продолжаю быть на 1 пиксель при рисовании в методе OnPaint. Я не понимаю почему.

Однако я не уверен, что это я не могу рассчитывать!

Я вернулся к чертежной доске с 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), откуда я и рассчитывал.

и Панель

Панель управления по умолчанию отображается без каких-либо границ.

Может кто-нибудь помочь мне понять, что мне здесь не хватает?

1 Ответ

1 голос
/ 12 марта 2011

Хм, вы уверены, что проблемная точка - это действительно верхний левый угол, а не нижний правый ?

Структура RECT , используемая внутренне для элементов управления Windows, исключительная , что означает, что пиксель с координатами (справа, снизу) находится непосредственно вне прямоугольник.

Сдвиг прямоугольника, соответствующего клиентской области, на 1 пиксель, как вы показали, решает эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...