如何使Winform复选框忽略DPI设置?

时间:2019-06-11 03:49:35

标签: c# winforms checkbox dpi .net-4.6.1

我试图在我的C#Winform应用程序中使所有复选框大于100%时忽略用户的DPI设置。 也就是说,即使用户增加了DPI设置,我也希望复选框的大小保持较小,就好像字体大小为100%一样。

使用FlatStyle.Flat复选框,以显示各种DPI设置中的复选框的大小:

  • 100%(96 DPI):11像素x 11像素(包括边框)
  • 125%(120 DPI):13 x 13
  • 150%(144 DPI):16 x 16

我已完成以下操作,但复选框的大小仍会增加:

  • AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
  • 将所有字体设置为使用GraphicsUnit.Pixel

那么,有没有办法让我的复选框保持11像素乘11像素而不管DPI设置如何?

如果不可能,我也尝试在自定义复选框上覆盖OnPaint以在复选框上绘制而不在Text上绘制。 但这很复杂,因为渲染框的起始(X,Y)坐标在某种程度上受CheckAlign和RightToLeft属性的影响。

这是代码段。 我打算让红色框在原始复选框上绘制。 绿色框作为我要显示的新复选框。

        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            // We need to override checkbox drawing for large font scaling since it will be drawn bigger than usual.
            // ex: At 100% scaling, checkbox size is 11x11. At 125% scaling, checkbox size is 13x13.
            if (e.Graphics.DpiX > 96)
            {
                // What is the x & y co-ords of the checkbox?
                int x = 0;
                int y = 0;

                using (SolidBrush brush = new SolidBrush(Enabled ? Color.White : SystemColors.Control))
                {
                    // Red checkbox is to override the original checkbox drawn
                    var scaleFactor = e.Graphics.DpiX / 96;
                    e.Graphics.DrawRectangle(new Pen(Color.Red), x, y, (float)Math.Round(CHECKBOX_WIDTH * scaleFactor) + 1, (float)Math.Round(CHECKBOX_HEIGHT * scaleFactor) + 1);

                    // Green checkbox is to draw the small checkbox that I want 11x11 (including border)
                    e.Graphics.FillRectangle(brush, x, y, CHECKBOX_WIDTH, CHECKBOX_HEIGHT);
                    e.Graphics.DrawRectangle(new Pen(Color.Green), x, y, CHECKBOX_WIDTH + 1, CHECKBOX_HEIGHT + 1); // Draw the outer border
                }
            }
        }

请问有人可以帮助我确定正确的X,Y坐标来绘制红色复选框(以便我可以在原始方框上绘制)。

谢谢:)

0 个答案:

没有答案