MonoMac NSDrawThreePartImage / C Bindings

时间:2012-12-07 15:12:39

标签: c mono pinvoke monomac

我想在我的MonoMac应用程序中使用函数NSDrawThreePartImage(Application Kit Functions Reference)。但是,我无法使用它。

查看NSCell.cs的源代码,我可以看到它被注释掉了:

//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 个答案:

答案 0 :(得分:1)

由于它是一个C API,您只需使用P / Invoke来绑定它。

关于复杂类型:

  • NSRect变为RectangleF - 请参阅monomac/src/AppKit/NSGraphics.cs中的NSGraphics.RectClip作为示例。
  • NSImage *变为IntPtr - 使用构造函数将IntPtr构造为Handle属性以获取地址。
  • GCFloat只是float
  • BOOLbool(有关示例,请参阅NSGraphics.BestDepth。)
  • int枚举使用NSCompositingOperation

所以,把这些碎片拼凑起来,就像这样:

[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。 非常感谢您对此进行测试!