Как сделать так, чтобы флажок Winform игнорировал настройку DPI? - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь установить все флажки в моем приложении C # Winform, чтобы игнорировать настройку DPI пользователя, когда она превышает 100%.т.е. я хочу, чтобы размер флажка оставался небольшим, как если бы он был на 100% шкале шрифта, даже когда пользователь увеличил настройку DPI.

При использовании флажков 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 на своем пользовательском флажке, чтобы закрасить флажок без рисования поверх текста.Но это оказывается сложным, поскольку начальная (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, чтобы я нарисовал красный флажок, пожалуйста (чтобы я мог закраситьоригинальная коробка).

Спасибо:)

...