仅为我的应用程序更改字体平滑而不是全局Windows字体平滑设置

时间:2010-12-03 16:55:56

标签: c++ windows winapi

我有一个用C ++编写的Windows应用程序,并使用Win32-API。我想以编程方式更改应用程序的字体平滑,从而允许我的应用程序的用户在“none”,“standard”和“cleartype”之间进行选择。

我使用SystemParametersInfo(SPI_SETFONTSMOOTHING,...)来更改平滑类型,但这会更改Windows的全局系统设置,并影响所有其他应用程序。有没有办法单独改变我的应用程序的平滑度?

编辑:澄清 - 我在窗口中嵌入了另一个窗口,因此我无法控制嵌入窗口中的字体。

谢谢

2 个答案:

答案 0 :(得分:3)

也许有一种更简单的方法,但有一种方法是将所有绘制的字体和所有控件使用的字体更改为关闭消除锯齿的字体。

您可以使用WM_GETFONTWM_SETFONT来获取/设置大多数控件使用的字体(它们都使用HFONT对象句柄)。

您可以使用GetObject获取HFONT的LOGFONT结构,然后调整LOGFONT上的抗锯齿标记,然后通过CreateFontIndirect创建新的HFONT。 (不要忘记在某个地方销毁字体,在没有控制权之后再使用它。)

还值得记住的是,某些字体可能强制消除锯齿或清除类型。因此,在编辑LOGFONT结构时,您可能需要更改字体名称和标志。

答案 1 :(得分:0)

在具有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>