Почему методы рисования controlpaint рисуют за пределами области рисования клиента?

#.net #winforms #draw #paint #delphi-prism

#.net #winforms #рисовать #Краски #delphi-prism

Вопрос:

У меня есть winform, на котором я хочу нарисовать пунктирную рамку, когда вы нажимаете левую кнопку мыши и перетаскиваете. Когда отпущена левая кнопка мыши, рамка должна исчезнуть. Я могу сделать это с помощью ControlPaint.Метод DrawReversibleFrame. Однако он рисует за пределами winform каждый раз, когда он не находится внутри winform. Кажется, что методы controlpaint используют экран в качестве области рисования, а не winform. Я прав?

Если мое предположение верно, как вы сообщаете controlpaint использовать winform в качестве области рисования.

Спасибо,

Ответ №1:

ControlPaint «обманывает», рисуя на рабочем столе.

Один из способов обойти проблему — самостоятельно посмотреть размеры. Как только вы дойдете до границы своего элемента управления, прекратите его вызывать.

Обновлено:

Похоже, вы не обязательно правильно преобразуете свои размеры.

Вот простой пример, чтобы всегда рисовать на элементе управления panel1:

 private void panel1_Paint(object sender, PaintEventArgs e) { 
  ControlPaint.DrawReversibleFrame(
    new Rectangle(panel1.PointToScreen(new Point(32, 32)), new Size(64, 64)), 
    panel1.BackColor, 
    FrameStyle.Dashed);
}
  

Комментарии:

1. @ larstech, это не моя проблема. на самом деле он начинает рисовать за пределами winform или в противном случае моя фактическая точка мыши (x, y) выглядит автоматически сдвинутой.

2. @digitalanalog добавил пример. Похоже, вы не преобразуете свои координаты.

3. @ larstech, спасибо, это работает. Вы также можете использовать RectangleToScreen. Это потрясающе. Еще раз спасибо.