1

我想在我的 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)来完成。有人可以确认这是正确的方法吗?

其次,我不熟悉如何去做,因为方法参数不仅仅是原语。也许有一个很好的指南,或者我可以参考一些现有的例子?

谢谢

4

1 回答 1

1

由于它是一个 C API,您可以简单地使用 P/Invoke 来绑定它。

关于复杂类型:

  • NSRect变为RectangleF- 请参阅NSGraphics.RectClipmonomac /src/AppKit/NSGraphics.cs中的示例。
  • NSImage *变成IntPtr- 使用构造函数IntPtr来构造它的Handle属性来获取地址。
  • GCFloat简直就是一个float
  • BOOLbool(参见NSGraphics.BestDepth示例)。
  • 用于枚举intNSCompositingOperation

因此,将各个部分放在一起,应该这样做:

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

于 2012-12-10T18:28:32.813 回答