2010-03-06 4 views
3

컴퓨터에 Windows Core 글꼴 중 하나가 설치되어 있지 않은 수많은 경우에 Courier New, Comic Sans MS, Arial 등의 문제가 발생했습니다. 이 중 하나를 만들려고 할 때마다 관련된 글꼴 또는 실제로 다른 글꼴로 넘어지지 않고 오류가 발생합니다.DotNET의 하드 코딩 글꼴

내가 Courier가되고 싶다면 Font를 구성하는 가장 좋은 방법은 무엇입니까?하지만 특별히 그것에 집착하지는 않습니까?

답변

4

글꼴을 얻기 위해 글꼴을 리소스로 포함하고 unsafe 키워드를 사용할 수 있으며 '안전하지 않은 글꼴'로 컴파일해야합니다 ... 다음은 사용자 정의 글꼴을 입력 할 때 사용한 코드의 예입니다 'OCR은'

글꼴의 개인 소장품을 선언
 
private PrivateFontCollection pfc = new PrivateFontCollection(); 
private Font _fntOCRFont = null; 
private enum FontEnum{ 
    OCR = 0 
}; 

... 글꼴 'OCR은'따라서 자원 이름이 될 것이다, '갑'은 네임 스페이스 이름 지정 규칙을 사용하여 리소스로 포함되는 'foo는 .ocraext.ttf '... 폰트를로드하여 콜렉션에 추가하는'InitOCRFont '를 찾으십시오.

 
private void InitOCRFont(){ 
    try{ 
     System.IO.Stream streamFont = this.GetType().Assembly.GetManifestResourceStream("foo.ocraext.ttf"); 
     if (streamFont != null){ 
      byte[] fontData = new byte[streamFont.Length]; 
      streamFont.Read(fontData, 0, (int)streamFont.Length); 
      streamFont.Close(); 
      unsafe{ 
       fixed(byte *pFontData = fontData){ 
        this.pfc.AddMemoryFont((System.IntPtr)pFontData, fontData.Length); 
       } 
      } 
     }else{ 
      throw new Exception("Error! Could not read built-in Font."); 
     } 
    }catch(Exception eX){ 
     throw new Exception("InitOCRFont Method - Exception occurred!\nException was: " + eX.Message); 
    } 
} 

여기에서 컨트롤을 설정하여 컬렉션을 반복하여 'InitializeCtlFont'참조하고 글꼴 크기는 10이며 굵은 'type-face'인 글꼴을 'OCR'글꼴로 설정합니다.

이 도움이

 
try{ 
    if (this._fntOCRFont != null) this._fntOCRFont.Dispose(); 
}catch{ 
} 
try{ 
    if (this.pfc != null) this.pfc.Dispose(); 
}catch{ 
} 

희망, 안부, 톰 : 사용자 컨트롤이 배치됩니다

 
private void InitializeCtlFont(){ 
    this._fntOCRFont = new Font(this.pfc.Families[0], 10.0F, System.Drawing.FontStyle.Bold); 
    if (this._fntOCRFont != null){ 
     foreach(Control ctl in this.Controls){ 
      if (ctl != null && ((ctl is Label) || (ctl is TextBox))){ 
         ctl.Font = this._fntOCRFont; 
        } 
     } 
    } 
} 

, Dispose 방법으로 다음과 같이 폰트가 차지하는 리소스를 확보하는 것이 필수적이다.

+0

Tommie, 아름다운 반응에 감사드립니다. 나는 그것이 나에게 잘 잘되지 않을까 걱정된다. 우리는 이러한 글꼴을 모두 배포 할 수 없으며, 내 응용 프로그램은 비트 심도있는 불가 지론이 있어야하며 Mono를 통해 Mac에서도 실행해야합니다. 나는이 하드 코어 솔루션에 의지하지 않을 것을 진심으로 바란다. –

+0

@David : Mac에서 Mono가 PrivateFontCollection을 가졌는지 확신 할 수 없다. 내가 쓸모 없을 것이라고 생각한다 ....순수한 크로스 플랫폼이 작동하려면 핀볼이없고 Win32 전용 API가 필요하지 않습니다. – t0mm13b

2

글쎄, 당신은 대신 특별히 택배, 에게 고정 폭 글꼴을 얻을 FontFamily.GenericMonospace을 사용할 수

Font f = new Font(FontFamily.GenericMonospace, 12, FontStyle.Regular); 

a few more such generic font families as well을있다.

원하는 글꼴을 사용하고 예외로 실행 한 후 최후의 수단으로 사용할 수도 있습니다.

+0

요하네스에게, 제가 이것을 적용 할 수 있는지 좀 더 조사 할 필요가 있습니다. –

2

이것은 매우 드문 경우입니다. Windows 글꼴 매퍼는 프로그램이 대상 컴퓨터에서 사용할 수없는 글꼴을 요청할 때 항상 대체 글꼴을 제공합니다. 대체 글꼴은 대개 XP의 Microsoft Sans Serif, 이후 버전의 Segoe UI입니다. 그것들 중 어느 것도 문제를 일으키지 않아야합니다.

그렇다면 다시 말하지만, 기계가 너무 엉망이어서 사용 가능한 핵심 글꼴이 없으면 전혀 사용할 수있는 트루 타입 글꼴이 없을 수 있습니다. 예, 그러면 프로그램이 폭파됩니다. 솔직히 말해서, 이것은 정말로 귀중한 고객이 아닌 이상 다루어야 할 것이 아닙니다. 그렇지 않은 경우 고객 지원팀에서 사소한 문제로 해결합니다.

+0

안녕하세요 nobugz, 이미 여러 번 발생했지만 제한적으로 보입니다. '이상한'현지화 (터키어, 중국어, 한국어 등)가있는 사람들에게 윈도우 글꼴 - 대체 논리가 충돌을 막을 수 있다고 생각 했었지만 분명히 그렇지 않습니다. 응답 주셔서 감사합니다, 지금은 이것을 무시하는 것이 최선의 방법 일 수 있습니다 ... –

+0

아, 그들은 라이센스가있는 Windows 사본을 사용하고 있습니까? 와인 같은 것 같아. 너의 문제는 아니야. –

+0

nobugz, 나도 몰라. 그리고 내가 그들에게 물어 본다면 아마 거짓말을하게 될 것입니다. 요점은, 그들이 Windows를 훔쳤 든, 우리 *의 * 합법적 인 고객들입니다. 이 수정 프로그램이 물론 어려운 것은 아니지만 ("글꼴 X 만 설치하기"), 코드가 왜 왜 엉망이되는지에 대한 호기심을 자극합니다. –

관련 문제