티스토리 뷰

Application/C#

Using Cleartype font in Windows Embedded CE

알 수 없는 사용자 2010. 11. 2. 11:24

Source : http://blog.naver.com/PostView.nhn?blogId=aquayo&logNo=80092583031&redirect=Dlog&widgetTypeCall=true

 

테스트 장비: Windows embedded CE 6.0

PC에서는 C#으로 ClearType을 처리하는데 TextRenderingHint를 가지고 처리가 가능한데, WinCE에서는 지원이 안되는 부분이므로 아래와 같이 처리를 할 수 있습니다.

이 처리가 필요한 이유는 기본 폰트가 아닌 다른 폰트를 사용시 글자가 깨끗하게 보이지 않으므로, ClearType을 적용한것입니다.

(C++은 아래의 함수를 그냥 호출시켜서 쓰시면 됩니다. C#은 대응하는 함수를 찾지 못해서 추가한것입니다)

레지스트리를 수정해서 하는 방법도 있던데 소스로 처리해봅니다.(Display Driver에 따라서 적용안될수도 있다는 것을 웹에서 본듯 합니다)

   1: using System.Runtime.InteropServices;
   2: ...
   3: [DllImport("coredll.dll")]
   4: private static extern int SystemParametersInfo(int uiAction, 
   5: int uiParam, out int pvParam, int fWinIni);
   6:  [DllImport("coredll.dll")]
   7: private static extern int SystemParametersInfo(int uiAction, 
   8: int uiParam, IntPtr pvParam, int fWinIni);
   9: const int SPI_GETFONTSMOOTHING = 0x0000004A; // use pvParam 
  10: to query
  11: const int SPI_SETFONTSMOOTHING = 0x0000004B; // use uiParam 
  12: to set
  13: public bool SystemWideClearType
  14:  {
  15: get
  16:  {
  17: int enabled;
  18:  
  19: SystemParametersInfo(SPI_GETFONTSMOOTHING, 0, out enabled, 0);
  20: return (enabled != 0);
  21:  }
  22: set
  23:  {
  24:  
  25: SystemParametersInfo(SPI_SETFONTSMOOTHING, value ? -1 : 0, IntPtr.Zero, 0);
  26:  }
  27:  }

사용법:

프로그램 시작시(각자 만든 APP) : SystemWideClearType = true;

프로그램 종료시:                        SystemWideClearType = false;

위의 코드를 활용해서 처리하면 내 프로그램이 구동하는 동안 모든 Windows의 APP 폰트가 ClearType으로 변경됩니다.

XP/Vista/windows7 에서 폰트를 ClearType 설정하는 것처럼 된다는 것입니다.

계속 cleartype을 유지시키기 위해서는 프로그램 종료시 false 세팅을 호출 안하면 됩니다.

디바이스에 나의 프로그램이 아닌 다른 프로그램도 실행되어져야 하는경우,

문제가 있을수 있겠네요. 그 프로그램은 cleartype을 안써야 폰트가 깨끗하게 보이는 경우가 있을때...

이런 경우, APP에서만 ClearType을 처리할 수 있습니다. LOGFONT사용...

우선 .NET Compact Framework 2.0이 필요합니다.

이것은 using Microsoft.WindowsCE.Forms; 을 사용하기 위함입니다. 3.x에는 안보이네요..ㅡㅡ;

문제는 메모리가 충분치 않은 상황에서 2.0을 사용하고자 한다면 배포시 설치 문제가 있을 수 있습니다.

따라서 2.0에 있는 LOGFONT클래스들과 enum값을 가지고 와서 3.x대에서 사용해보는데 exception이 발생하네요.

LogFont lf;
Font myFont;          
lf = new LogFont();
lf.Height = -32;
lf.Width = 0;
lf.Escapement = 0;
lf.Orientation = 0;
lf.Weight = (LogFontWeight)0;
lf.Italic = 0;
lf.Underline = 0;
lf.StrikeOut = 0;
lf.CharSet = LogFontCharSet.Default;
lf.OutPrecision = LogFontPrecision.Default;
lf.ClipPrecision = LogFontClipPrecision.Default;
lf.Quality = LogFontQuality.ClearType;
lf.PitchAndFamily = LogFontPitchAndFamily.Default;
lf.FaceName = "AritaM";
myFont = Font.FromLogFont(lf); <- 여기서 발생하네요.

굳이 APP에만 적용할 필요가 없다면 상단의 소스를 사용하시면 됩니다.

소스는 첨부해두니 해결하시는 분은 답글 적어주세요ㅜ.ㅜ 2.0을 안쓰고 하는 방법......

'Application > C#' 카테고리의 다른 글

C# 다른 버튼 액션 갖다쓰기.  (0) 2014.05.10
XNA를 시작합시다!  (0) 2011.12.31
컨트롤 드래그  (0) 2010.10.31
C# 메세지 처리  (0) 2010.07.16
닷넷에서의 INI 파일 입출력  (0) 2010.07.15