2013-05-22 3 views
1

.NET 응용 프로그램에서 GDI +에서 찾을 수없는 GDI 메서드를 호출하려고합니다.GDI +에없는 .NET에서 Windows GDI 메서드를 어떻게 사용합니까?

특히 this method 지정된 글꼴에 대해 커닝 쌍을 가져옵니다. 현재 지원되지 않는 HTML5 캔버스에 커닝 (문자 간격 지정)을 구현하고 싶습니다. 가장 좋은 방법은 내 서버에서 커닝 쌍을 꺼내어 커닝 테이블을 클라이언트에 반환하는 것입니다.

.NET의 Windows 라이브러리 기능을 어떻게 사용합니까?

답변

2

:

  • 1 : 프로젝트
  • 2 System.Runtime.InteropServices 네임 스페이스를 추가 : 프로젝트에 API 클래스를 추가하고 GetKerningPairs를 사용하자 메서드 이 함수는 KERNINGPAIR이라는 구조체를 사용한다는 것을 기억하십시오. 클래스에 정의되어 있는지 확인해야합니다. 그렇지 않으면 컴파일 오류가 발생합니다!

    class API 
    { 
        [DllImport("gdi32.dll")] 
        static extern uint GetKerningPairs(IntPtr hdc, uint nNumPairs, 
        [Out] KERNINGPAIR[] lpkrnpair); 
    
        [StructLayout(LayoutKind.Sequential)] 
        struct KERNINGPAIR 
        { 
         public ushort wFirst; // might be better off defined as char 
         public ushort wSecond; // might be better off defined as char 
         public int iKernAmount; 
    
         public KERNINGPAIR(ushort wFirst, ushort wSecond, int iKernAmount) 
         { 
          this.wFirst = wFirst; 
          this.wSecond = wSecond; 
          this.iKernAmount = iKernAmount; 
         } 
    
         public override string ToString() 
         { 
          return (String.Format("{{First={0}, Second={1}, Amount={2}}}", wFirst, wSecond, iKernAmount)); 
         } 
        } 
    } 
    

이제 API 클래스 그 질문은 구체적으로는 .NET을 통해 커닝 쌍을 얻을 수 있는지 여부를 요구하고있다

+1

좋은 물건, 고마워! 나는 이것을 시험해보고 되돌아온 커닝 페어가 정확한지 아닌지 확인합니다. 이 방법을 사용한 경험이 있습니까? – jcvandan

+0

당신은 환영합니다, 나는 두렵습니다. 그러나 제공된 입력이 올바른 형식으로되어 있다면 걱정할 필요가 없습니다. 그리고 http://www.pinvoke.net/은 매우 유용한 웹 사이트입니다. winAPI' – Mehran

2

나는 운이다고 생각합니다.

this thread

에 따르면,이 한 쌍의 커닝에 대한 관련 클래스가 없습니다 것 같다. 글리프는 글리프 인덱스와 너비를 조정할 수있는 적절한 기본값을 생성합니다.

pinvoke을 시도 할 수 있지만 해당 게시물에서 참고로

주의 사항 말합니다 수는 반환 된 데이터가 기본 유니 코드 블록으로 만 것 같습니다.

코드 페이지를 변경하여 자세한 정보를 얻을 수있는 방법이있을 수 있습니다.

모든 커닝 데이터를 가져올 수있는 유일한 방법은 파일을 직접 구문 분석하는 것입니다. 적어도 말하기는 쉽지 않습니다.

이 메소드 호출하기위한 Windows API에서이 방법을 찾을 수 있습니다
+0

을 통해이 메소드를 호출 할 수 있습니다, 언급은 내가 연결 방법의 사용은 금지된다 질문에. @Mehran의 다른 대답은 그 메소드를 호출하는 방법을 보여줍니다. GDI 메소드를 호출 해 본 적이 있습니까? 그것은 내가 필요한 것일 수도있는 것 같습니다. – jcvandan

+0

@ 도미셔 - 예, 제가 게시 한 두 번째 링크 (핀 보크)는 Mehran이 제안한 것과 정확히 일치하며,주의해야 할 점은 기본 유니 코드 블록에 대한 데이터 만 가져올 수 있다는 것입니다. 괜찮 으면 정렬됩니다. –

+0

아아, 내가 아는 바로는 "기본 유니 코드 블록에 대한 데이터 만 가져올 수 있습니다."라는 것이 정확히 무엇을 의미합니까? – jcvandan