DPI 感知应用程序中的 SizeGripStyle

SizeGripStyle in DPI-aware app

我在不同 DPI 下的表单 属性 SizeGripStyle 有问题。我的表单将 属性 AutoScaleMode 设置为 Font 并使用 API 启用缩放(因为 ClickOnce 应用程序)。抓地力不知何故低于形式。在互联网上我没有找到任何提及。如果可能的话,知道如何修复它吗?

There you have pics of grip's behavior on different DPI

该程序使用 C# 4.0 和 WF。

这是 Windows 本身的错误。 Winforms asks the visual style renderer 绘制抓地力。它把工作搞得一团糟,不是让它变大而是变小。它实际上不应该做任何事情,你指定它应该用手柄填充的矩形。一个 bug,不幸的是,对于视觉样式渲染器来说并不少见。

对此您无能为力,希望他们有一天会修复该错误。但有一件事,你必须自己拉把手。将窗体的 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);
}

不如从视觉样式渲染中获得的 "dimple" 样式漂亮,您也可以考虑绘制位图,但您需要它的多个版本来匹配 DPI。