2015-01-01 30 views
5

enter image description here私は、ES_READONLYフラグを持つエディットコントロールの色を変更する簡単な解決策を探しています。私が持っているコード(並べ替え)は、編集コントロールが編集可能なときには機能しますが、読み取り専用フラグを持つ編集コントロールには何の影響もありません。読み取り専用エディットコントロールの背景色を変更することは可能です

case WM_CTLCOLOREDIT: 
{ 
    HDC hdc = (HDC)wParam; 
    //if (GetDlgItem(hwnd, IDC_EDIT_IN) == (HWND)lParam) 
    //{ 
     SetTextColor(hdc, RGB(255, 255, 255)); // Set text color to white 
     SetBkColor(hdc, RGB(255, 255, 255)); // Set background color to black 
    //} 
    return 0; 
} 
break; 

私のコードが正しく機能しているかどうかを確認するためのコメントがありますが、それは読み取り専用ではない編集コントロールで行います。他のエディットコントロールでES_READONLYを取り出すと、それが動作します。私はチャットプログラムを作成しており、ユーザーがチャットボックス領域に入力できるようにしたくありません。読み込み専用の場合はグレーの色になりますが、白い色が欲しいです。これを行う別の方法がありますか?また、色は、編集コントロールの全体の高さではなく、テキストのある領域のみを色付けします。私は間違って何をしていますか?

+2

「WM_CTLCOLORSTATIC」をご覧ください。 –

+2

MSDNの記事を読むと、ブラシを返すよう指示されます。 –

答えて

5

ブラシを作成して追跡する必要があります。次に、return 0の代わりにこのブラシをコードスニペットに返します。ブラシが不要になったら削除する必要があります。これは通常、WM_DESTROYメッセージに応答して行われます。

あなたの場合、ストックブラシを使用して弾丸をかわすことができます。これは私が推奨するものです。あなたが適切にこのメッセージを処理しなければならないので、読み取り専用モードでは、エディットコントロールは、WM_CTLCOLORSTATIC代わりのWM_CTLCOLOREDITに応える

:編集/静的コントロールを塗装する場合

case WM_CTLCOLORSTATIC: 
{ 
    if((HWND)lParam == GetDlgItem(hwnd, IDC_EDIT_IN)) 
    { 
     SetBkMode((HDC)wParam, TRANSPARENT); 
     SetTextColor(hdc, RGB(255, 255, 255)); 
     return (LRESULT)((HBRUSH)GetStockObject(BLACK_BRUSH)); 
     // if edit control is in dialog procedure change LRESULT to INT_PTR 
    } 
    else // this is some other static control, do not touch it!! 
     return DefWindowProc(hwnd, message, wParam, lParam); 
} 

、あなたは絵のために利用できる3部を持っています

  • テキストの色
  • テキストの背景
  • コントロールのBAあなたが希望する色(ウィンドウプロシージャ、またはダイアログボックスのreturn (INT_PTR)someBrushreturn (LRESULT)someBrush)でブラシを返す必要があります希望の色に全体のコントロールを描画するためにckground

SetBkColor

あなたの呼び出しは、コントロールの背景色から異なるあるテキスト背景の色を設定します。それでSetBkModeTRANSPARENTパラメータと呼んで、テキストの背景にコントロールの背景を一致させたいと言っているのです。

私はストックブラシを使用しています。これは、追跡する必要はなく、もはや不要になった後に削除する必要もないためです。

まだ、他の色が必要な場合があります。その場合は、ここであなたがする必要がありますものです:

  • グローバル変数HBRUSHたり、ウィンドウ/ダイアログの手順でstatic HBRUSH変数を作成します。
  • ウィンドウプロシージャ内にある場合は、WM_CREATEに応答してこの変数を初期化します。ダイアログの手順でブラシをWM_INITDIALOGに初期化する場合。何かのようにsomeBrush = CreateSolidBrush(RGB(255, 0, 255));詳細と例についてはdocumentationを参照してください。
  • 上記の例で示したように、このブラシを返します(ウィンドウプロシージャの場合はreturn (LRESULT)someBrush、ダイアログボックスの場合はreturn (INT_PTR)someBrush)。
  • 不要になったときにブラシを削除します。これは通常WM_DESTROYで行われ、DeleteObject(someBrush);が呼び出されます。 WM_CLOSEは時々このシナリオの例を見つけるためにインターネットを検索(スキップすることができながら、

は、私は強く、これはあなたのウィンドウは常に受信するメッセージであるので、あなたがWM_DESTROY代わりのWM_CLOSEに応じて、削除を行うことをお勧め)。

ご質問がありましたら、お気軽にお問い合わせください。宜しくお願いします。

+0

MSDNからの引用:「DeleteObject」を呼び出すことによって、ストックオブジェクトを削除する必要はありません(ただし、有害ではありません)。 – 0xC0000022L

関連する問題