2017-11-28 4 views
1

글꼴을 사용하여 설치 한 모든 글꼴의 이름을 인쇄합니다. 글꼴을 읽을 수없는 기호 (예 : 기호), 기본 글꼴 (Segoe UI)을 사용하는 경우를 제외하고는 인쇄합니다.글꼴의 문자 집합을 결정할 수 있습니까?

var installedFonts = new System.Drawing.Text.InstalledFontCollection().Families; 

foreach (var family in installedFonts) 
{ 
    var font = new Font(family, 12); 
    if (font.GdiCharSet == 2) // Symbols font 
    { 
     // Print using default font 
    } 
    else // Readable font 
    { 
     // Print using font 
    } 
} 

을 그것은 결코 기본 글꼴을 사용하지 않고 인쇄합니다 :

지금, 나는 내가 이해할 수없는 다음과 같은 발견 무언가를 시도하고있다. 또한 모든 글꼴의 GdiCharSet은 글꼴이 다른 문자 집합을 사용하는 경우에도 1을 반환합니다. 조금 더 철저히 읽으면 다음과 같이 표시됩니다.

Font(String, Single, FontStyle, GraphicsUnit, Byte) 생성자에 다른 문자 집합이 지정되어 있지 않으면이 속성은 1을 반환합니다.

Byte 값을 지정하지 않았으므로 분명히 글꼴을 올바르게 작성하지 못하고 있습니다 (다른 생성자를 모두 사용하고 있습니다). 이것은 내가 글꼴의 CharSet 가치를 아는 또 다른 방법 ("실제"방법)이라고 생각하게 만듭니다. 하지만 어디서나 찾을 수는 없습니다. 아무도 내가 이것을 알 수있는 방법을 알고 있니?


메모장으로 메모장을 관리합니다. 서식> 글꼴 ... 글꼴 선택기를 엽니 다. Script에 사용 된 문자 세트가 표시되는 것을 볼 수 있습니다.

enter image description here

+0

[ "문자표"] (http://sites.psu.edu/symbolcodes/wp-content/uploads/sites/4419/2015/07/CharMapWin7.png) 창 도구를 사용하는 경우 모든 글꼴에는 문자 집합을 만드는 옵션이 있습니다. 그래서 당신의 질문은 말이되지 않습니다. 귀하의 목표는 "어떤 글자가이 글자체로 인쇄 될 수 있는지"를 결정하려는 시도 인 것 같습니다. 그 질문은 또 다른 질문입니다. [this one] (https://stackoverflow.com/questions/1439551/get-supported-characters-of-a-font-in-c-sharp) (wpf 용). – Sinatr

+0

@Sinatr 아마도 잘못된 접근법을 사용하고있을 것입니다. 그러나 메모장이 그렇게하고 있기 때문에 어떻게 든 식별 할 수 있습니다. 내 질문은, 어떻게 가능할 수 있었는지 (가능한 이후)? 언급 한 생성자에서 'Byte'값을 어떻게 사용할지를 어떻게 알 수 있습니까? –

+0

모든 바이트 값은 글꼴을 성공적으로 생성합니다 (시도해보십시오. 아마도 틀 렸습니다). 필요한 문자가 포함됩니까? 질문입니다. – Sinatr

답변

1

당신은 GetTextMetrics 기능 (https://msdn.microsoft.com/en-us/library/windows/desktop/dd144941(v=vs.85).aspx)를 사용합니다. 상호 운용성 사용하여 호출 할 때, 다음과 같은 구조를 검색 : 글꼴의

문자 집합을 :

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)] 
internal struct TEXTMETRIC 
{ 
    public int tmHeight; 
    public int tmAscent; 
    public int tmDescent; 
    public int tmInternalLeading; 
    public int tmExternalLeading; 
    public int tmAveCharWidth; 
    public int tmMaxCharWidth; 
    public int tmWeight; 
    public int tmOverhang; 
    public int tmDigitizedAspectX; 
    public int tmDigitizedAspectY; 
    public char tmFirstChar; 
    public char tmLastChar; 
    public char tmDefaultChar; 
    public char tmBreakChar; 
    public byte tmItalic; 
    public byte tmUnderlined; 
    public byte tmStruckOut; 
    public byte tmPitchAndFamily; 
    public byte tmCharSet; 
} 

구조체, tmCharSet의 마지막 멤버가 당신을 위해 무엇을 찾고 있습니다. 문자 세트는 다음 값 중 하나 일 수 있습니다

this link에 따라 ... ANSI_CHARSET BALTIC_CHARSET CHINESEBIG5_CHARSET DEFAULT_CHARSET EASTEUROPE_CHARSET GB2312_CHARSET GREEK_CHARSET HANGUL_CHARSET MAC_CHARSET OEM_CHARSET RUSSIAN_CHARSET SHIFTJIS_CHARSET SYMBOL_CHARSET TURKISH_CHARSET VIETNAMESE_CHARSET, 당신은 간단한 구현을 찾을 수 있습니다 필요한 코드.

+0

그래, 내가 그랬어, @시나 너가 그것을 언급했다. 내가 끝내 자마자 받아 들일거야. 감사합니다.] –

+0

더 많은 지원이 필요하면 의견을 물어보십시오. –