1

Visual Studio (WinForms) では、GroupBox コントロールをフォームにドラッグすると、ヘッダー ラベルがデフォルトの色 (青色) になります。これで、Forecolor プロパティが "{Name=ControlText, ARGB=(255, 0, 0, 0)}" として表示されることがわかりましたが、Name=ControlText は役に立たず、たまたま黒くなった ARGB も役に立ちません。 .

それは何色の青ですか?

書けるようになりたい

myLabel.ForeColor = Color.FromArgb(?, ?, ?, ?);

まったく同じ色合いの青になります。

(確かにこれはロケット科学ではありませんが、見た目ほど簡単ではありません)。

編集#1。いくつかの回答に基づいて、質問を明確にして言い換えます。私はそれがテーマに結びついていることを知っており、GroupBox の ControlText は Label の ControlText とは異なります。「Windows XP」テーマを使用して WindowsXP を使用しています。では、Windows XP テーマを使用しているときに GroupBox に適用されるこの青の色合い (RGB に関して) を見つけるにはどうすればよいでしょうか? すなわち何ですか?? ? ? 値。

4

2 に答える 2

3

これは、ユーザーの現在のテーマに完全に依存しています。Windows クラシック テーマのグループ ボックス キャプションに別の色が使用されています。標準の Windows XP Luna テーマの 3 つすべて、Aero テーマ、そしておそらく Windows 8 で完全に登場する何かがあります。言うまでもなく、ユーザーはカスタマイズ可能です。つまり、標準のテーマ カラーを使用していない可能性もあります。

したがって、コンピューターに表示される内容に基づいて RGB 値をハードコーディングすることは、適切な計画ではありません。これは、アプリが目立たないようにするための良い方法です。したがって、スクリーンショットを撮り、ピクセルの色をサンプリングするというこの質問に対する他の回答で提案されている戦略は正しいです。それは正しいことよりも間違っていることが多いでしょう。

代わりに、システムにこの値を要求して、ユーザーの現在の構成と一致することを確認する必要があります。これは、次の 2 つの一般的な可能性に分けることができます。

  1. ユーザーは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);
    
  2. ユーザーが 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 要素を更新する必要があります。

上記のリンクのドキュメントに記載されているように、これは静的イベントであり、アプリケーションを閉じるときにイベント ハンドラーをデタッチする必要があるという事実に特に注意を払う価値があります。そうしないと、メモリ リークが発生する可能性があります。

于 2012-05-30T04:18:57.063 に答える
0

現在 ForeColor、GroupBox のセットは何かを確認してくださいControlText。これらのすべての色が Windows のテーマに由来するものであるかどうかを確認してください。SystemColors以下のように使用して色を取得できます。

myLabel.ForeColor = SystemColors.ControlText; 

以下の色から見つけられるかどうかを確認してください。

あなたが金色を取得したい場合:Color.Gold

ここに画像の説明を入力

画像はこちらから

于 2012-05-30T03:39:43.720 に答える