在dpi感知应用中使用SizeGripStyle

本文关键字:SizeGripStyle 应用 dpi 感知 | 更新日期: 2023-09-27 18:12:24

我有一个问题,在不同的DPI的形式的属性SizeGripStyle。我的表单属性AutoScaleMode设置为字体,并启用缩放使用API(因为ClickOnce应用程序)。握把不知怎么地在形状下面。在网上我没有找到任何提及。如果可能的话,你知道怎么修理它吗?

这里有握把在不同DPI下的行为图

程序使用c# 4.0和WF编写

在dpi感知应用中使用SizeGripStyle

这是Windows本身的错误。Winforms要求视觉样式渲染器绘制手柄。它把工作搞砸了,不是把它做大,而是把它做小。它实际上都不应该这样做,你指定了它应该用握把填充的矩形。一个bug,不幸的是,对于视觉样式渲染器来说并不罕见。

你对此无能为力,希望他们有一天能修复这个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);
}

不像你从视觉样式渲染中得到的"酒窝"样式那么漂亮,你也可以考虑画一个位图,但是你需要几个版本来匹配DPI