Эта проблема возникает в Windows 10 Creators Update или более поздней версии с целевым увеличением 175% или выше .Net 4.7.2. Далее, мы вызываем SetProcessDPIAware в файле Program.cs.
Если мы не вызываем это, тогда шрифты выглядят ужасно при высоком разрешении, особенно при 300%.
static class Program
{
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool SetProcessDPIAware();
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
//if (Environment.OSVersion.Version.Major >= 6)
SetProcessDPIAware();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
ВАЖНЫЙ ШАГ Мы также перейдем в Расширенные настройки масштабирования и отключим функцию «ПозвольтеWindows пытается исправить приложения, чтобы они не были размыты "... потому что у нас есть пользователи, отключающие это. Изображение настроек Windows
В приведенном ниже приложении у нас есть 3 элемента управления PictureBox. Крайний левый PictureBox является источником, а его изображение представляет собой файл PNG, созданный с разрешением 96 т / д.
Пользователь нажимает кнопку над средним PictureBox, чтобы скопировать исходное изображение в метафайл (используемый в качестве холста для рисования). ) и использует это для заполнения свойства Image среднего PictureBox. В режиме High DPI вы можете видеть, что размер изображения недостаточно велик или что только часть изображения была скопирована в метафайл.
Кнопка над PictureBox в крайнем правом углу копирует исходное изображение с использованием растрового изображения в видехолст для рисования. Он правильно отображает на 175%.
Изображение результатов приложения
Этот код преобразует исходное изображение в метафайл и вставляет его в другой PictureBox.
private void DrawUsingMetafile()
{
try
{
Image img = this.pictureBox1.Image;
Metafile mf = NewMetafile();
using (Graphics gmf = Graphics.FromImage(mf))
{
gmf.DrawImage(img, 0, 0, img.Width, img.Height);
}
this.pictureBox2.Image = mf;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Exception", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
public static Metafile NewMetafile()
{
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) // offscreen device context
{
IntPtr hdc = g.GetHdc(); // gets released by g.Dispose() called by using g
return new Metafile(hdc, EmfType.EmfPlusOnly);
}
}
Есть идеи, почему это происходит?