我想在我的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)来完成。有人可以确认这是正确的方法吗?
其次,我不熟悉如何解决这个问题,因为方法参数不仅仅是原语。也许有一个很好的指导这样做,或者我可以参考的一些现有的例子?
由于
答案 0 :(得分:1)
由于它是一个C API,您只需使用P / Invoke来绑定它。
关于复杂类型:
NSRect
变为RectangleF
- 请参阅monomac/src/AppKit/NSGraphics.cs中的NSGraphics.RectClip
作为示例。NSImage *
变为IntPtr
- 使用构造函数将IntPtr
构造为Handle
属性以获取地址。GCFloat
只是float
。BOOL
为bool
(有关示例,请参阅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。 非常感谢您对此进行测试!