Невозможно настроить DPI приложения - это не дубликат

Я не могу сделать свое приложение зависимым от DPI. В app.manifest я раскомментировал:

<application xmlns="urn:schemas-microsoft-com:asm.v3">
    <windowsSettings>
      <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
    </windowsSettings>
  </application>

В App.config я добавил:

<appSettings>
    <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
</appSettings>

Я слежу за вопросами и ответами в Сделать приложение vb.net с учетом DPI и https://www.telerik.com/blogs/winforms-scaling-at-large-dpi-settings-is-it-even-possible-

Мое приложение имеет единую форму с одним пользовательским элементом управления. На каждом из них я пробовал запускать приложение с AutoScaleMode для каждой из различных настроек: None, Dpi, Font, Inherit (по умолчанию используется Font). Я использую единственный монитор, который установлен на заводе-изготовителе на моем ноутбуке.

В любом случае e.graphics.dpix и e.graphics.dpiy (где e - PaintEventArgs) равны 96.0. Оно должно быть 128,0 = 1920 пикселей / 15 дюймов и 128,0 = 1080 / 8,4375 дюймов.

Что мне не хватает?


person RJPisscat    schedule 06.10.2020    source источник
comment
Если ваш проект - VB.NET, возможно, вы столкнулись с этой ошибкой github.com/microsoft/dotnet-framework-early-access/issues/39   -  person Jason Tyler    schedule 06.01.2021
comment
Да, это VB.Net. Спасибо! Я не установил .Net 5.0, и, возможно, он там разрешен (для связанного сообщения, не разрешенного в 4.8), и если не решено в 5.0, я попробую их предложение.   -  person RJPisscat    schedule 08.01.2021


Ответы (1)


Вот частичное решение.

Для рисования на экране установите Graphics.PageUnit = GraphicsUnit.Point (по умолчанию GraphicsUnit.Display).

(Я не понял, как настроить AutoSize для UserControl, который я рисую, без увеличения DPI.)

Для печати используйте Graphics.PageUnit = GraphicsUnit.Pixel.

' printing
dim gs as Drawing2D.GraphicsState = e.Graphics.Save
Try
    e.Graphics.PageUnit = GraphicsUnit.Pixel
    dim DpiX as Single = e.Graphics.DpiX
    dim DpiY as Single = e.Graphics.DpiY
    DoPrinting(e.Graphics, DpiX, DpiY)  ' this is where you implement the code to draw your page
Catch ex as Exception
Finally
    e.Graphics.Restore(gs)
End Try

' painting to screen
dim gs as Drawing2D.GraphicsState = e.Graphics.Point
Try
    e.Graphics.PageUnit = GraphicsUnit.Pixel
    dim DpiX as Single = 128.0!    ' your value may vary; to find out, divide
    dim DpiY as Single = 128.0!    ' physical size of screen by screen resolution
    DoPrinting(e.Graphics, DpiX, DpiY)  ' this is where you implement the code to paint to screen
Catch ex as Exception
Finally
    e.Graphics.Restore(gs)
End Try
person RJPisscat    schedule 08.10.2020