Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Использование класса GlyphTypeface в проекте WinForms приводит к изменению разрешения форм  [new]
YK13
Member

Откуда:
Сообщений: 225
Добрый день уважаемое сообщество
Вот столкнулся с проблемой. В приложении WinForms мне необходимо использовать объект типа GlyphTypeface из пространства имен System.Windows.Media
Как только я инициализирую объект данного типа или объект в котором данный тип является generic параметром (Array, List etc..) Разрешение объекта Graphics, рисующего форму изменяется с 96DPI на 120DPI. И форма визуально изменяется в размере. В приложениях WPF такого не присходит.
Может быть кто нибудь из Вас сталкивался с этой проблемой и знает как ее решить. Буду очень рад любому совету и подсказке.
С уважением ко всем участникам форума
27 окт 21, 12:03    [22388654]     Ответить | Цитировать Сообщить модератору
 Re: Использование класса GlyphTypeface в проекте WinForms приводит к изменению разрешения форм  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4283
YK13,

подробнее опишите, на чем рисуете полученное изображение, через что вы Geometry перегоняете в Bitmap? через DrawImage? или через ContentHost?
27 окт 21, 13:09    [22388720]     Ответить | Цитировать Сообщить модератору
 Re: Использование класса GlyphTypeface в проекте WinForms приводит к изменению разрешения форм  [new]
YK13
Member

Откуда:
Сообщений: 225
автор
подробнее опишите, на чем рисуете полученное изображение, через что вы Geometry перегоняете в Bitmap? через DrawImage? или через ContentHost?


Я ничего не рисую. У меня есть класс, который наследует System.Windows.Forms.Form Просто при переопределении метода OnPaint в этом класс или в обработчике события Paint вы можете увидеть значение DPI у объекта Graphichs
Привожу код, если я не очень доступно объяснил
        private void button1_Click(object sender, EventArgs e)
        {
            GlyphTypeface gtf = new GlyphTypeface();
            //Какая то бизнес логика
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            ////Метод переопределен только для того, чтобы показать, что значение dpi изменилось
            ///При вызове этого метода до клика на кнопку значения dpi равны 96
            ///форма нормально отрисовывается
            ///при вызове после клика на кнопку значения dpi равны 120 и форма визуально меняется в размере
            float dpiX = e.Graphics.DpiX;
            float dpiY = e.Graphics.DpiY;
            base.OnPaint(e);
         }
27 окт 21, 14:47    [22388830]     Ответить | Цитировать Сообщить модератору
 Re: Использование класса GlyphTypeface в проекте WinForms приводит к изменению разрешения форм  [new]
_дух_
Member

Откуда:
Сообщений: 20
YK13,

Namespace: System.Windows.Media
Assembly: PresentationCore.dll

Я предполжу что этим инициализируется WPF из WinForm
27 окт 21, 17:08    [22388979]     Ответить | Цитировать Сообщить модератору
 Re: Использование класса GlyphTypeface в проекте WinForms приводит к изменению разрешения форм  [new]
YK13
Member

Откуда:
Сообщений: 225
автор
Я предполжу что этим инициализируется WPF из WinForm

То есть, Вы имеете ввиду, что инициализация WPF изменяет разрешение. В соответствии с Вашим предположением, попробовал инициализировать в обработчике кнопки объект какого либо другого типа из пространства имен System.Windows.Media. В частности System.Windows.Media.CharacterMetrics - такой же эффект. Вопрос в другом как с этим жить? Можно ли как то использовать WPF объекты в WinForm без вышеописанного эффекта?
27 окт 21, 20:33    [22389090]     Ответить | Цитировать Сообщить модератору
 Re: Использование класса GlyphTypeface в проекте WinForms приводит к изменению разрешения форм  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4283
YK13,
ну идея юзать WPF в WF всегда была не очень. это только верхушка айсберга проблем, но довольно серьезная из всех тех проблем, что приходилось решать при интеграции WPF в WF. проще создать окно WPF и засунуть туда WF...
27 окт 21, 20:36    [22389094]     Ответить | Цитировать Сообщить модератору
 Re: Использование класса GlyphTypeface в проекте WinForms приводит к изменению разрешения форм  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6257
YK13
Привожу код, если я не очень доступно объяснил

Воспроизвел это у себя именно в приведённом варианте - DPI не поменялся (.Net 4.8, AnyCPU, Win10 Pro x64 1909):
public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }

  void button1_Click(object sender, EventArgs e)
  {
    var gtf = new GlyphTypeface();
    Console.WriteLine("GTF: {0}",gtf);
  }

  protected override void OnPaint(PaintEventArgs e)
  {
    Console.WriteLine("{0}/{1}", e.Graphics.DpiX, e.Graphics.DpiY);
    base.OnPaint(e);
  }
}

и есть подозрение, что причиной вышеописанного поведения является та самая
//Какая то бизнес логика


Roman Mejtes
роще создать окно WPF и засунуть туда WF

Тоже не очень. Мне доводилось как-то хостить винформсовский ReportViewer в WPF-ном окне (т.к. для WPF аналог отсутствует в принципе) - начинаются всякие мелькания и артефакты отрисовки при ресайзе/перемещении окна, чего-то начинает на ровном месте просвечивать сквозь него, хотя окно непрозрачное, итд итп. Что винформс в WPF, что наоборот - оно как вставная челюсть, как-то работает, но родное решение лучше.
28 окт 21, 06:54    [22389185]     Ответить | Цитировать Сообщить модератору
 Re: Использование класса GlyphTypeface в проекте WinForms приводит к изменению разрешения форм  [new]
_дух_
Member

Откуда:
Сообщений: 20
YK13,

сколько мониторов, какое разрешение, какое скалирование?
28 окт 21, 07:47    [22389194]     Ответить | Цитировать Сообщить модератору
 Re: Использование класса GlyphTypeface в проекте WinForms приводит к изменению разрешения форм  [new]
YK13
Member

Откуда:
Сообщений: 225
Сон Веры Павловны
и есть подозрение, что причиной вышеописанного поведения является та самая
YK13
//Какая то бизнес логика



Увы, нет. Эффект происходит даже если далее нет никакой бизнес логики

Пробовал, на разных машинах. И WinPro и WinHome с разным количеством мониторов - эффект присутствовал.
Говорю "присутствовал" потому что сейчас пробую на машине WinPro, на которой еще вчера тестировал это, когда писал этот пост. Вчера всё было, причем проблема обнаружилась уже давно (с самого начала использования класса GlyphTypeface - еще несколько месяцев назад)
Но сейчас никакого эффекта. Попробую вечером на другой машине
Странно. Вроде бы нигде не было каких либо апдейтов за последние сутки. Вообще не нахожу этому какого либо объяснения
28 окт 21, 13:25    [22389363]     Ответить | Цитировать Сообщить модератору
 Re: Использование класса GlyphTypeface в проекте WinForms приводит к изменению разрешения форм  [new]
YK13
Member

Откуда:
Сообщений: 225
Нашел в чем проблема. Как оказалось все зависит от настроек дисплея в Windows. Параметры>Система>Дисплей Если значение настройки "Изменение размероа текста приложений и других элементов" больше 100% тогда появляется описываемый в этом посте эффект. Но как это побороть не знаю. Пробовал поиграть со значением AutoScaleMode (по умолчанию стоит System.Windows.Forms.AutoScaleMode.Font)
Не помогло
28 окт 21, 20:02    [22389575]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить