これは、ユーザーの現在のテーマに完全に依存しています。Windows クラシック テーマのグループ ボックス キャプションに別の色が使用されています。標準の Windows XP Luna テーマの 3 つすべて、Aero テーマ、そしておそらく Windows 8 で完全に登場する何かがあります。言うまでもなく、ユーザーはカスタマイズ可能です。つまり、標準のテーマ カラーを使用していない可能性もあります。
したがって、コンピューターに表示される内容に基づいて RGB 値をハードコーディングすることは、適切な計画ではありません。これは、アプリが目立たないようにするための良い方法です。したがって、スクリーンショットを撮り、ピクセルの色をサンプリングするというこの質問に対する他の回答で提案されている戦略は正しいです。それは正しいことよりも間違っていることが多いでしょう。
代わりに、システムにこの値を要求して、ユーザーの現在の構成と一致することを確認する必要があります。これは、次の 2 つの一般的な可能性に分けることができます。
ユーザーはVisual Styles (テーマ) サービスをオンにしています。つまり、Luna や Aero などを使用しています。
この場合、Visual Styles サービスに適切な色を照会する必要があります。System.Windows.Forms.VisualStyles
名前空間で提供されるマネージド ラッパーを使用することは簡単です。たとえば、次のコードを (C# で任意に) 記述できます。
using System.Windows.Drawing;
using System.Windows.Forms.VisualStyles;
// ...
var vsr = new VisualStyleRenderer(VisualStyleElement.Button.GroupBox.Normal);
var groupBoxCaptionColor = vsr.GetColor(ColorProperty.TextColor);
ユーザーが Visual Styles サービスをオフにしているか、利用できない (XP より前のバージョンの Windows)。つまり、"Windows クラシック" テーマを使用しています。
System.Drawing.SystemColors
この場合、グループ ボックスはキャプションに標準の 3D (コントロール) カラーを使用するため、クラスから簡単に取得できます。お探しの物件は次のControlText
とおりです。
using System.Windows.Drawing;
// ...
var groupBoxCaptionColor = SystemColors.ControlText;
実際のアプリケーションでは、考えられるすべてのクライアント構成を処理するために、これら 2 つのケースを組み合わせる必要があります。Visual Styles サービスがオフになっている場合、最初のルートが爆撃されるため、最初にそれを確認する必要があります (これは、Application.RenderWithVisualStyles
プロパティを照会することで実行できます。オフになっている場合は、2 番目の方法にフォールバックします。次のようなものです。
using System.Windows.Drawing;
using System.Windows.Forms.VisualStyles;
// ...
public Color GroupBoxCaptionColor
{
get
{
// Test to see if Visual Styles are enabled.
if (Application.RenderWithVisualStyles())
{
// If Visual Styles are enabled, use that color.
var vsr = new VisualStyleRenderer(VisualStyleElement.Button.GroupBox.Normal);
return vsr.GetColor(ColorProperty.TextColor);
}
else
{
// Otherwise, fall back to the Classic theme.
return SystemColors.ControlText;
}
}
}
このGroupBoxCaptionColor
プロパティは、グループ ボックス コントロールのキャプションに使用される現在のColor
色に対応するオブジェクトを返します。このオブジェクトには技術的には RGB 値がありますが、アプリが使用する色が常に現在のテーマの色と同期していることを確認するために、この曲とダンスのすべてを実行する必要があります。Color
さまざまな力が働いていることを理解すれば、それほど複雑ではありません。楽しみはそれだけではありません。アプリケーションの実行中にユーザーがシステム テーマを変更する可能性を処理するかどうかを検討する必要があります。その場合、実際のグループ ボックス コントロールのキャプションの色は変更されますが、プログラムで決定されたキャプションの色は廃止され、新しいテーマではなく古いテーマに一致します。
この修正ではSystemEvents.UserPreferenceChanged
、ユーザーがコントロール パネルでテーマを変更したときに発生するイベントを監視しています。そのイベントのハンドラー メソッドで、グループ ボックスのキャプションの色を再度取得し、それを使用している可能性のある UI 要素を更新する必要があります。
上記のリンクのドキュメントに記載されているように、これは静的イベントであり、アプリケーションを閉じるときにイベント ハンドラーをデタッチする必要があるという事実に特に注意を払う価値があります。そうしないと、メモリ リークが発生する可能性があります。