核心在於位元位移與遮罩,將 R、G、B 分量重新排序。
public static int ColorToColorRef(Color color)
{
int argb = color.ToArgb(); // AARRGGBB
int blue = argb & 0xFF;
int green = (argb >> 8) & 0xFF;
int red = (argb >> 16) & 0xFF;
// 組合為 BGR (0x00BBGGRR)
return (blue << 16) | (green << 8) | red;
}
public static Color ColorRefToColor(int colorRef)
{
// COLORREF 為 0x00BBGGRR
int red = colorRef & 0xFF;
int green = (colorRef >> 8) & 0xFF;
int blue = (colorRef >> 16) & 0xFF;
// Alpha 設為 255 (不透明)
return Color.FromArgb(255, red, green, blue);
}
// 簡潔版
public static Color ColorRefToColor(int colorRef) =>
Color.FromArgb(colorRef & 0xFF, (colorRef >> 8) & 0xFF, (colorRef >> 16) & 0xFF);
當 MFC 控制項 (如 CColorDialog) 傳回 COLORREF,需轉為 Color 供 .NET 屬性 (如 BackColor) 使用;反之亦然。封裝為擴充方法可提升開發效率:
public static class ColorExtensions
{
public static int ToColorRef(this Color c) => ...;
public static Color ToColor(this int colorRef) => ...;
}