2009-01-05 11:58追記:取り消し線をつけた部分は内容的に無駄がありました。直したエントリをあげていますので、ご参照ください。

ToolStripの色 – SharpLab.のエントリで愚痴っていた、「Visual Studio Add-InのToolStripの色をVisualStudioに合わせる方法が分からない」という問題が解決しました。探してみるとあるもので、vsThemeColors 列挙体 (EnvDTE80)DTE2.GetThemeColor メソッド (EnvDTE80)の二つを使うことで、Visual Studioのコントロールの配色を取得することができます。DTE2.GetThemeColor メソッドvsThemeColors 列挙体を渡してやることで、uint型の戻り値が得られます。但し、ARGBの並び方が違うのか、このuint型の値をColor構造体のFromArgbメソッドに渡しても正しい色は得られないようで、

private Color converVsThemeColor(vsThemeColors themeColor) {
    uint color = _dte2.GetThemeColor(themeColor);
    int a = (int)color / 0x1000000;
    int b = (int)(color - a * 0x1000000) / 0x10000;
    int g = (int)(color - a * 0x1000000 - b * 0x10000) / 0x100;
    int r = (int)(color - a * 0x1000000 - b * 0x10000 - g * 0x100);
    return Color.FromArgb(0xFF, r, g, b);
}

上のメソッドを作って、これに通しています。このメソッド内の変数aですが、アルファ値として0xFFを持っているものと思ったら何故か2が入っているという謎の挙動をみせたので、とりあえず無視して0xFFで決め打ちしています。

image

で、結果がこれ(左がAdd-In)。なんか微妙にまだ色合いが違うような気がしますが(さっきのメソッド内の計算が間違っている?)、まぁ統一感は出ているのではないでしょうか。

 

追記(2009-01-04 20:34):

daruyanagiさんのところでBitConverterを使うといいよというエントリが!早速直してみました。

private Color converVsThemeColor(vsThemeColors themeColor) {
    uint color = _dte2.GetThemeColor(themeColor);
    byte[] argb = System.BitConverter.GetBytes(color);
    return Color.FromArgb(0xFF, argb[0], argb[1], argb[2]);
}

おぉ、手軽!これは便利ですね。シフト演算とか、自信がなかったので避けていたのですが、こんな逃げ道があったとは。