Изменение сглаживания шрифтов только для моего приложения, а не глобальные настройки сглаживания шрифтов Windows - PullRequest
0 голосов
/ 03 декабря 2010

У меня есть приложение для Windows, написанное на C ++ и использующее Win32-API.Я хочу программно изменить сглаживание шрифтов моего приложения, что позволяет пользователю моего приложения выбирать между «none», «standard» и «cleartype».

Я использую SystemParametersInfo (SPI_SETFONTSMOOTHING, ...), чтобы изменить тип сглаживания, однако это изменит глобальные системные настройки Windows и повлияет на все остальные приложения.Есть ли способ изменить сглаживание только для моего приложения?

Редактировать: Уточнение - я встраиваю другое окно в свое окно, и поэтому не могу контролировать шрифты во встроенном окне.

Спасибо

Ответы [ 2 ]

3 голосов
/ 03 декабря 2010

Возможно, есть более простой способ, но один из способов - заменить все шрифты, которые вы рисуете, и которые используют все ваши элементы управления, на шрифты с отключенным сглаживанием.

Вы можете использовать WM_GETFONT и WM_SETFONT для получения / установки шрифтов, используемых большинством элементов управления (они оба используют дескрипторы объектов HFONT).

Вы можете использовать GetObject , чтобы получить LOGFONT структура для HFONT, затем отрегулируйте флаги сглаживания на LOGFONT, затем создайте новый HFONT через CreateFontIndirect .(Не забудьте уничтожить шрифт где-нибудь после того, как его больше не использует никакой элемент управления.)

Также следует помнить, что некоторые шрифты могут заставить сглаживать или очищать типна.Поэтому вам может понадобиться изменить имя шрифта, а также флаги при редактировании структуры LOGFONT.

0 голосов
/ 11 июля 2018

На современных дисплеях с настройками DPI и Windows 10 даже при включенном ClearType шрифты могут выглядеть размытыми. Я потратил несколько часов на то, чтобы понять, почему в простом приложении Win32 в оформлении окон есть крутой тонкий системный шрифт и тот же шрифт, некрасиво размытый в клиентской области. Ключевое слово dpiAware. Примите приведенный ниже код для манифеста вашего приложения, и проблема будет решена:

<assembly
    xmlns="urn:schemas-microsoft-com:asm.v1"
    xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" manifestVersion="1.0">
<assemblyIdentity
    version="1.0.0.0"
    processorArchitecture="AMD64"
    name="Scintilla.SciTE.SciTE"
    type="win32"
/>
<trustInfo
xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel>
    </requestedPrivileges>
  </security>
</trustInfo>
<asmv3:application xmlns="urn:schemas-microsoft-com:asm.v3">
    <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
        <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
    </asmv3:windowsSettings>
</asmv3:application>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...