SizeGripStyle в приложении с поддержкой DPI

У меня проблема со свойством формы SizeGripStyle в другом DPI. В моих формах свойство AutoScaleMode установлено в значение "Шрифт" и включает масштабирование с помощью API (из-за приложения ClickOnce). Сцепление как-то уходит ниже формы. В интернете я не нашел упоминаний. Есть идеи как это исправить, если это возможно?

Там у вас есть фотографии поведения сцепления на разных DPI

Программа находится на C# 4.0 и WF.

1 ответ

Решение

Это ошибка в самой Windows. Winforms просит визуальный стиль рендера нарисовать захват. Это плохо делает работу, вместо того, чтобы делать ее больше, она делает ее меньше. Это на самом деле не должно делать ни того, ни другого, вы указываете прямоугольник, который он должен заполнить ручкой. Черт возьми, ошибка, к сожалению, не редкость для визуального стиля рендера.

Очень мало вы можете с этим поделать, надеюсь, когда-нибудь они исправят ошибку. Но, с одной стороны, вам придется самостоятельно взять в руки. Установите для свойства SizeGripStyle формы значение Auto и переопределите OnPaint(), чтобы нарисовать его:

protected override void OnPaint(PaintEventArgs e) {
    base.OnPaint(e);
    var gripSize = (int)(16 * e.Graphics.DpiX / 96f);
    var rc = new Rectangle(this.ClientSize.Width - gripSize, 
                           this.ClientSize.Height - gripSize, gripSize, gripSize);
    ControlPaint.DrawSizeGrip(e.Graphics, this.BackColor, rc);
}

Не такой красивый, как стиль "ямочка", который вы получаете от визуальных стилей рендеринга, вы также можете рассмотреть возможность рисования растрового изображения, но вам потребуется несколько его версий для соответствия DPI.

Другие вопросы по тегам