potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

C#&Win32 API Win32 APIのRECT構造体と.NET 5.0のRectangle構造体は互換性がない

Win32 APIRECT構造体と.NET 5.0のRectangle構造体は互換性がありません。C#RECTを使う場合、一度RECTとして取得してからRectangleへ変換する必要があります。

C#RECT構造体ラッパー

// [StructLayout(LayoutKind.Sequential)]
struct RECT
{
    public int Left;
    public int Top;
    public int Right;
    public int Bottom;

    public Rectangle ToRectangle()
    {
        return Rectangle.FromLTRB(Left, Top, Right, Bottom);
    }
}

以下の通り、RECTRectanglerightbottomを持つか、widthheightを持つかが異なります。

RECT構造体の定義(Microsoft Docsより)

typedef struct tagRECT {
  LONG left;
  LONG top;
  LONG right;
  LONG bottom;
} RECT, *PRECT, *NPRECT, *LPRECT;

Rectangle構造体の定義(Reference Sourceより)

public struct Rectangle {
    ...(省略)

    private int x;
    private int y;
    private int width;
    private int height;

    ...(省略)
}

HDM_GETITEMRECTメッセージでヘッダー項目の領域を取得しようとしたら詰まったのでメモします。