「Xamarin.Mac/NSViewの座標系を左下原点から左上原点に変更する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
19行目: 19行目:
 
     public override bool IsFlipped { get { return true; } }
 
     public override bool IsFlipped { get { return true; } }
  
 +
    // 描画
 
     public override void DrawRect(CoreGraphics.CGRect dirtyRect)
 
     public override void DrawRect(CoreGraphics.CGRect dirtyRect)
 
     {
 
     {
        // 描画
 
 
         var cgContext = NSGraphicsContext.CurrentContext.GraphicsPort;
 
         var cgContext = NSGraphicsContext.CurrentContext.GraphicsPort;
 
         cgContext.MoveTo(100, 100);
 
         cgContext.MoveTo(100, 100);

2017年6月13日 (火) 02:04時点における版

NSViewでは標準で「左下が原点で右が+Xで上+Y」となっている。 いわゆる小学校の算数で習う座標系だ。 エクセルのグラフなども基本はこれである。

しかしコンピューターの世界ではなぜか古くから「左上が原点で下方向が+Yで右方向が+X」という座標系が一般的となっている。 PC-9801のGRAMもWindowsのGDIもDirectXも皆これである。 このためWindowsなどからアプリを移植する際にこの点を考慮しないでコピペすると逆さま表示になる。

しかし根本のソースコードが壮大すぎて手を入れるのが難しい場合もある。 そういうときはNSViewのIsFlippedプロパティをオーバーライドして常に「true」を返すようにすればよい。 この設定は、NSGraphcis系のみならず、CoreGraphicsにも反映される。

// アンチエイリアス無効化
public partial class FlippedView : AppKit.NSView
{
    // trueで左上原点
    // falseで左下原点
    public override bool IsFlipped { get { return true; } }

    // 描画
    public override void DrawRect(CoreGraphics.CGRect dirtyRect)
    {
        var cgContext = NSGraphicsContext.CurrentContext.GraphicsPort;
        cgContext.MoveTo(100, 100);
        cgContext.AddLineToPoint(200, 200);
        cgContext.StrokePath();
    }
}

関連項目

参考文献