2010-12-21 22 views
3

Windows APIを使用して基本的なGUIを作成していますが、問題が発生しました。それは私が(RGB(230,230,230))を設定したカスタム背景色で開くメインウィンドウから始まります。次に、静的コントロールを使用してテキストを左上隅に表示します。スタティックコントロールの背景色はC++で

settingstext = CreateWindow("STATIC", 
          "SETTINGS", 
          SS_LEFT | WS_CHILD, 
          12, 
          20, 
          100, 
          20, 
          hwnd, 
          NULL, 
          proginstance, 
          NULL); 
ShowWindow(settingstext, 1); 

これは動作しますが、テキストが表示されたときに、私は、メインウィンドウに合わせて、それの背景を変更する方法が必要か、そうでなければ調和しないように、それはちょうど見えます。

私の質問それはどうやってやるの?私は現在、以下の方法を使用していますが、私は知りたかったのですが、システムカラーを変更せずに静的コントロールの機能の後で、バックグラウンドカラーを何らかの形で永久に設定する方法はありますか?コントロールであり、WM_CTLCOLORSTATICメッセージを送信するものではありません。私は、メッセージループの外でGetDC関数とSetBkColor関数を使って実験しましたが、何も動作しません。

case WM_CTLCOLORSTATIC: 
    { 
    HDC hdcStatic = (HDC) wParam; 
    SetTextColor(hdcStatic, RGB(0,0,0)); 
    SetBkColor(hdcStatic, RGB(230,230,230)); 
    return (INT_PTR)CreateSolidBrush(RGB(230,230,230)); 
    } 

私は、ウィンドウが再描画するたびに呼び出される必要がある機能と私のメッセージループを埋めるためにしたくない...

  • ので、これをやりたいです。
  • 変更はこの静的コントロールにのみ適用されます。

私は、少なくとも適切な方向に私を指して、提供される可能性のある任意のヘルプに感謝します、ありがとう。

+1

'(HWND)lParam == setstext'をチェックすることで、' WM_CTLCOLORSTATIC'コードの効果を静的コントロールだけに制限することができます。 作成したすべてのブラシが決して削除されないという点で、あなたの例に問題があります。 –

答えて

10

静的テキストコントロールの場合、テキストの色や背景を設定する永続的な方法はありません。変更を単一の静的コントロールに適用する場合でも、コントロールが描画される直前に親dlgprocでWM_CTLCOLORSTATIC通知メッセージを処理する必要があります。

static HBRUSH hBrush = CreateSolidBrush(RGB(230,230,230)); 

case WM_CTLCOLORSTATIC: 
{ 
    if (settingstext == (HWND)lParam) 

       //OR if the handle is unavailable to you, get ctrl ID 

    DWORD CtrlID = GetDlgCtrlID((HWND)lParam); //Window Control ID 
    if (CtrlID == IDC_STATIC1) //If desired control 
    { 
     HDC hdcStatic = (HDC) wParam; 
     SetTextColor(hdcStatic, RGB(0,0,0)); 
     SetBkColor(hdcStatic, RGB(230,230,230)); 
     return (INT_PTR)hBrush; 
    } 
} 

あなたがSetBkMode(hdcStatic, TRANSPARENT)を使用することができ、親ダイアログのコントロールの背景を透明にするために探している場合。

+1

'SetBkColor'をすでに呼び出している場合、バックグラウンドに' hBrush'を作成する必要がある理由を説明できますか?透明な背景の場合は透明なブラシも必要ですか? – Ameen

1

静的ウィンドウをサブクラス化してオーナー描画を行うと考えましたか?

+0

それが何であるか分かりませんので、私はサブクラス化についていくつかの素早い研究をします。 – contrapsych

+0

基本的には、静的コントロールに送られたメッセージをコードに送る代わりに、メッセージを元のハンドラに渡すことを忘れないでください。背景の消去とペイントのメッセージを処理する場合は、ウィンドウに任意のものを表示させることができます。 –

+0

それは、それが単一のコントロールでのみ発生するようにする、また、私はそのコントロールのために行うだろうカスタムプロシージャの関数の数を減らす方法です。基本的には、「プロシージャ内の多くの機能ではない」という全体では、アプリケーションが再描画する必要があるたびにこれらの機能を実行する必要性が減るように感じられるか、それほど大きな問題ではないようです? – contrapsych

1

私はそれを行う恒久的な方法があると思います。

ラベルを作成した直後に、GetDC()関数を使用してデバイスコンテキストを取得します。 次に使用してください:

SetTextColor(hdcStatic, RGB(0,0,0)); 
SetBkColor(hdcStatic, RGB(230,230,230)); // Code Copied from the above answer by cpx. 

これはすべきです。