Frage

Ich versuche, in der aktuell ausgewählten Systemschriftart mit der ATSU api in einer Carbon-App zu ziehen. Und die Schriften kommen aus kühner als alle anderen native Anwendungen. Hier ist ein Screenshot Beispiel dafür, was ich spreche:


(Quelle: memecode.com )

Die obere Zeile ist XCode, und die Mitte ist meine Anwendung einer Nicht-Fettschrift und der Boden ist meine App mit einem Fettschrift verwenden. Ich habe den gleichen Text zu machen es leicht, die Gewichtsdifferenz zwischen ihnen zu sehen. Der Code, den ich die Stile erstellen verwende ich ziehe mit ist:

if (Face() AND !(e = ATSUCreateStyle(&d->hFont)))
{
    // Lookup ID
    ATSUFontID atsuFont = 0;
    e = ATSUFindFontFromName(Face(),
                            strlen(Face()),
                            kFontFamilyName,
                            (FontPlatformCode)kFontNoPlatform,
                            (FontScriptCode)kFontNoScript,
                            (FontLanguageCode)kFontNoLanguage,
                            &atsuFont);
    if (!e)
    {
        Fixed Size;
        Size = PointSize() << 16;
        Boolean IsBold = Bold();
        Boolean IsItalic = Italic();
        Boolean IsUnder = Underline();

        // Set style attr
        ATSUAttributeTag Tags[]         = {kATSUFontTag,     kATSUSizeTag, kATSUQDItalicTag, kATSUQDUnderlineTag, kATSUQDBoldfaceTag};
        ATSUAttributeValuePtr Values[]  = {&atsuFont,        &Size,        &IsItalic,        &IsUnder,            &IsBold};
        ByteCount Lengths[]             = {sizeof(atsuFont), sizeof(Size), sizeof(IsItalic), sizeof(IsUnder),     sizeof(IsBold)};
        if (!(e = ATSUSetAttributes(d->hFont,
                                    CountOf(Tags),
                                    Tags,
                                    Lengths,
                                    Values)))
        {
            GDisplayString ds(this, "A");
            d->Height = ds.Y();
            return true;
        }
    }
}

Wo „Face ()“ liefert einen C-String den Namen der Schriftart enthält, „Point ()“ gibt eine ganze Zahl, die Punktgröße enthält, möchte ich etc etc. Ich retreiving diese Werte mit diesem Code:

Str255 Name;
SInt16 Size;
Style St;
OSStatus e = GetThemeFont(  kThemeSmallSystemFont,
                            smSystemScript,
                            Name,
                            &Size,
                            &St);
if (e) printf("%s:%i - GetThemeFont failed with %i\n", __FILE__, __LINE__, e);
else
{
    Info.Face(p2c(Name));
    Info.PointSize(Size);
    Status = true;
}

Und es gibt gültig aussehendes Gesicht / Punkt Info, und in der Tat sieht die Schrift richtig außer es sucht kühner als andere Anwendungen. Es ist vielleicht nicht wie ein großer Unterschied aussehen, aber wenn Sie Ihre gesamte App voller Text ist wird es offensichtlich sein. Und mein Flaggschiff-Produkt ist ein E-Mail-Client ... also viel Text.

Die Zeichnung Code, der die Layouts erstellt und schließlich ruft ATSUDrawText ziemlich lang ist, und ich bin nicht sicher, ob es das Problem verursacht .. Ich denke, es ist mehr Stil ist im Zusammenhang ... aber wenn müssen durch Ich werde einen Link zu diese Quelle später.

Kann mir jemand helfen, meine Schriftarten immer suchen weniger fett?

War es hilfreich?

Lösung

Ich habe den Kakao ATSU Beispielcode in Kohlenstoff umgewandelt und lief, dass neben meinem eigenen Code. Es sah richtig so verfeinert ich, dass Code und arbeitete heraus, was ich anders mache. Es stellte sich heraus, dass es die erste Phase ist eine Schriftart Namen in eine ATSUFontID des Drehens. Offensichtlich ich mit ATSUFindFontFromName bin, die ganz vernünftig zu sein scheint, jedoch sieht es anders als der Rest des Betriebssystems. Der richtige Abfall Ersatzcode lautet:

CFStringRef fontName = CFStringCreateWithBytes( kCFAllocatorDefault,
                                                (UInt8*)Face(),
                                                strlen(Face()),
                                                kCFStringEncodingUTF8,
                                                false);
ATSFontRef atsFont = ATSFontFindFromName(fontName, kATSOptionFlagsDefault);
CFRelease(fontName);
ATSUFontID font = FMGetFontFromATSFontRef(atsFont);

So, jetzt meine apps sind gut aussehen:)

Andere Tipps

Eigentlich, das ist die fette Schrift Sie in der oberen Zeile in der App zu sehen sind. Hier fotografische Beweise , mit Lucida Grande Bold 11 in TextEdit auf der rechten Seite. Die untere Linie in der App ist, dass mit Faux Fett hinzugefügt.

Und Sie wissen, Kohlenstoff ist veraltet, nicht wahr?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top