2012-12-07 3 views
1

MonoMac 응용 프로그램에 NSDrawThreePartImage (Application Kit Functions Reference) 함수를 사용하고 싶습니다. 그러나, 그것은 나에게 유용하지 않다. NSCell.cs의 소스를 보면MonoMac NSDrawThreePartImage/C Bindings

, 나는 그것이 설명으로 볼 수 있습니다

//APPKIT_EXTERN void NSDrawThreePartImage(NSRect frame, NSImage *startCap, NSImage *centerFill, NSImage *endCap, BOOL vertical, NSCompositingOperation op, CGFloat alphaFraction, BOOL flipped); 

나는 그것이 구현되지 않았다, 이것은 단지 의미 생각합니다.

나는 이것이 C API임을 알고 있습니다. 수동으로이 메소드를 호출 할 때 무엇이 ​​관련 될 수 있습니까? 그것은 Pinvoke (Binding Objective-C Types)로 할 수있는 것처럼 보입니다. 누군가 올바른 접근 방식인지 확인할 수 있습니까?

둘째, 메서드 매개 변수가 단순히 프리미티브가 아니기 때문에이 문제를 해결하는 방법에 익숙하지 않습니다. 아마도이 작업을 수행하기위한 좋은 지침이나 내가 참조 할 수있는 몇 가지 기존 예제가있을 것입니다.

감사합니다.

답변

1

C API이므로 P/Invoke를 사용하여 간단히 바인딩 할 수 있습니다. 복잡한 유형에 대해서

:

  • NSRectRectangleF된다 - 예는 monomac/src/AppKit/NSGraphics.csNSGraphics.RectClip 참조.
  • NSImage *IntPtr이됩니다. IntPtr을 사용하여 주소를 가져 오는 Handle 속성을 생성하는 생성자를 사용하십시오.
  • GCFloat은 단순히 float입니다.
  • BOOLbool (예 : NSGraphics.BestDepth 참조)입니다.
  • NSCompositingOperation 열거 형에 대해 int을 사용하십시오.

그래서, 함께 조각을 넣어,이 같은 그것을 수행해야합니다

[DllImport (Constants.AppKitLibrary)] 
extern static void NSDrawThreePartImage (RectangleF rect, IntPtr startCap, IntPtr centerFill, IntPtr endCap, bool vertial, int op, float alphaFraction, bool flipped); 

public void DrawThreePartImage (RectangleF frame, NSImage startCap, NSImage centerFill, NSImage endCap, bool vertical, NSCompositingOperation op, float alphaFraction, bool flipped) 
{ 
    // Or throw ArgumentNullException if NULL is not allowed here 
    var startCapPtr = startCap != null ? startCap.Handle : IntPtr.Zero; 
    var centerFillPtr = centerFill != null ? centerFill.Handle : IntPtr.Zero; 
    var endCapPtr = endCap != null ? endCap.Handle : IntPtr.Zero; 
    NSDrawThreePartImage (frame, startCapPtr, centerFillPtr, endCapPtr, vertical, (int)op, alphaFraction, flipped); 
} 

NSDrawNinePartImage은 비슷한 방식으로 작동합니다.

왜 댓글을 달았는지 모르지만 대부분 구현되지 않은 것 같습니다. 누락 된 조각이 더 있습니다. 작동 여부를 알려 주시면 NSCell.cs에 추가하겠습니다.

편집 : 방금 ​​NSCell.cs에 https://github.com/mono/monomac/commit/7c60d5756c49331642d2348c7c83320b9ec3f549을 추가했습니다. 테스트 해 주셔서 감사합니다.

+0

그래, 테스트 및 서면으로 작동합니다. 고맙습니다! 나는 가능한 한 빨리 현상금을 수여 할 것이다 – TheNextman

+0

쿨! 이미지 인수로'NULL'을 전달할 수 있습니까? NSCell.cs에 추가하고 싶습니다. 그리고 ArgumentNullException을 던져야하는지 궁금합니다. –

+0

null을 전달하는 것은 의미가 없지만 어느 쪽도 상처를주지는 않습니다. 나는 던지지 않을 것이다. – TheNextman