WM_CTLCOLOR メッセージを使用する情報。

サポートが終了した KB の内容についての免責事項

この記事は、マイクロソフトがサポートを提供しなくなった製品について記述しています。 したがって、この記事は「現状のまま」で提供され、更新されることはありません。

3.00 3.10 WINDOWS kbprg

概要

WM_CTLCOLOR メッセージは画面に描画するたびにその子ウィンドウのコントロール (オプション ボタン、チェック ボックスをオン、スクロール バーなど) のいずれかのウィンドウに送信されます。このメッセージの前に、コントロールを描画します。コントロールの外観を変更することが望ましい場合は、WM_CTLCOLOR メッセージを処理することによってこれを実行できます。

詳細

WM_CTLCOLOR を送信するとき、wParam には、(この場合はコントロール) の子ウィンドウのディスプレイ コンテキストへのハンドルが含まれています。LParam の LOWORD は子ウィンドウをその ID 番号を識別し、lParam の HIWORD 含まれている次の値のいずれかを描画するコントロールの種類を指定します。

   CTLCOLOR_BTN            button control
CTLCOLOR_DLG dialog box
CTLCOLOR_EDIT edit control
CTLCOLOR_LISTBOX list box
CTLCOLOR_MSGBOX message box
CTLCOLOR_SCROLLBAR scroll bar
CTLCOLOR_STATIC static text, frame, or rectangle

WM_CTLCOLOR を処理するとき、ブラシへのハンドルが返される必要があります。ブラシのハンドルを返すことができないとすると、デバッグ バージョンの Windows でデバッグ モニターに Windows の FatalExit になります。


DefWindowProc()は既にこのメッセージへの応答としてハンドルを返しますただし、アプリケーションは、コントロールの色をカスタマイズするのには別のハンドルを返すことができます。返されるハンドルは、コントロールの描画に使用するブラシを指定します。たとえば、Windows で 2.x では、次のコードは、すべてのボタンの薄い灰色の背景を描画します。

   case WM_CTLCOLOR:      if (HIWORD(lParam) == CTLCOLOR_BTN)
return (GetStockObject(LTGRAY_BRUSH));

return (GetStockObject(WHITE_BRUSH));

この例では、他のすべてのコントロールの背景は白く塗られたは。GetStockObject()がパラメーターで指定されているストック ブラシ ハンドルを返すことに注意してください。Windows 3.0 以降では、ボタン コントロールの背景色を変更するには、オーナー描画ボタンを作成する必要があります。


ブラシのハンドルを返すと、ブラシのハンドルがGetStockObject()から返されたものに制限がないために、いくつかの興味深い可能性が表示されます。ビットマップ パターン ブラシを作成できます。パターン ブラシのハンドルは、WM_CTLCOLOR メッセージへの応答で返された場合、ブラシ コントロールの背景の描画に使用されます。


次のコードは、スクロール バーのスクロール ボックスのトラックの領域を描画をペイントにバスケットの網目パターンに変更します。

   /* Add these global variables. The array of WORDs specifies the */    /* pattern for the brush                                        */ 
HBRUSH hBrush;
HBITMAP hBitmap;
WORD wWeave[]={0x0F, 0x8B, 0xDD, 0xB8, 0x70, 0xE8, 0xDD, 0x8E};

...

/* Add these lines to WinMain */
hBitmap = CreateBitmap(8, 8, 1, 1, (LPSTR)wWeave);
hBrush = CreatePatternBrush(hBitmap);

...

/* Add this case to the Windows procedure or wherever the */
/* messages are processed. */
case WM_CTLCOLOR:
if (HIWORD(lParam) == CTLCOLOR_SCROLLBAR)
return (hBrush);

return (GetStockObject(WHITE_BRUSH));

WM_CTLCOLOR メッセージは、コントロールの次の 5 つのクラスにも適用されます。


  1. チェック ボックス、オプション ボタン、およびプッシュ ボタン: コントロールが選択されているブラシは、配置されている四角形の領域を描画します。ペイントしたパターンには、コントロール図形とテキストが描画されます。
  2. コントロールの編集: 編集領域を描画します。
  3. グループ ボックス: タイトルのテキストの背後にある四角形の領域を描画します。
  4. スクロール バー: つまみトラックの周りの領域を描画します。
  5. リスト ボックス: リストの領域を描画します。
静的テキスト、フレーム、および四角形は WM_CTLCOLOR による影響を受けません。


: アプリケーションで Windows 3.0 以降では、ボタンの表面の色を変更できません。ただし、ユーザーは、システム内のすべてのアプリケーションのボタンの色を変更するのには、コントロール パネルを使用することができます。これは、WIN の [色] セクションを変更することによっても実現できます。INI ファイルを追加するのには、「ButtonFace ="ボタン表面色の RGB カラー値を指定する行。


WM_CTLCOLOR メッセージの処理と、アプリケーションによって作成された子ウィンドウの色だけが変更します。Windows では、これらの各コントロールの親ウィンドウに WM_CTLCOLOR メッセージを送信します。一部として Windows に含まれているスクロール バー コントロールを編集するか、リスト ボックスには影響しません。システムによって生成されるスクロール バーのつまみのトラックの領域は、WIN でのみ変更できます。INI またはコントロール パネルを使用します。


ダイアログ ボックスの背景全体をペイントすることもできます。ダイアログ ボックスの色を指定するのには、次のコードを使用できます。

   long FAR PASCAL MainWindowProc(....);
...

case WM_CREATE:
hTempBrush = LoadBitmap(hInst, (LPSTR)"MyPatternBrush");
hBrush = CreatePatternBrush(hTempBrush);
DeleteObject(hTempBrush);

...

case WM_DESTROY:
DeleteObject(hBrush);

...

BOOL FAR PASCAL
MyDialogProc(....);

...

case WM_CTLCOLOR:
if (bMonoChrome)
return (FALSE); // Do nothing if on a monochrome monitor
// bMonoChrome is a global set during
// initialization.

if (CTLCOLOR_DLG == HIWORD(lParam))
UnrealizeObject(hBrush);

SelectObject((HDC)wParam, hBrush);

if (CTLCOLOR_DLG == HIWORD(lParam))
SetBrushOrg((HDC)wParam, 0, 0);

SetBkMode((HDC)wParam, TRANSPARENT);

SetTextColor((HDC)wParam, RGB(0, 0, 0));

return(hBrush);

...

このコードは、あるパターンのビットマップは適切な位置、ダイアログ ボックス全体にわたって確実します。SDKPaint を使用して作成されたビットマップの名前は、"MyPatternBrush"です。このビットマップを含める必要があるのです。RC ファイルです。
プロパティ

文書番号:32685 - 最終更新日: 2017/02/01 - リビジョン: 1

フィードバック