potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

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メッセージでヘッダー項目の領域を取得しようとしたら詰まったのでメモします。