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です。
  • BOOLですboolNSGraphics.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。これをテストしてくれてありがとう!

于 2012-12-10T18:28:32.813 に答える