WM_CTLCOLOR 메시지를 사용 하는 정보:

만료된 KB 콘텐츠 고지 사항

이 문서는 Microsoft에서 더 이상 지원하지 않는 제품에 대해 작성되었습니다. 따라서 이 문서는 “있는 그대로" 제공되며 더 이상 업데이트되지 않습니다.

3.00 3.10 WINDOWS kbprg

요약

WM_CTLCOLOR 메시지 될 때마다 자식 창의 컨트롤 (라디오 단추, 확인란, 스크롤 막대 등) 중 하나를 화면에 그릴 수 있는 창으로 전달 됩니다. 이 메시지는 컨트롤의 그리기 앞에 옵니다. 바람직한 컨트롤의 모양을 변경할 때이 WM_CTLCOLOR 메시지를 처리 하 여 수행할 수 있습니다.

자세한 내용

WM_CTLCOLOR 보내면 wParam (이 예에서 컨트롤) 자식 창에 대 한 디스플레이 컨텍스트에 대 한 핸들을 포함 합니다. LParam의 LOWORD 자식 창 ID 번호로 식별 및 HIWORD lParam의 포함은 다음 값 중 하나를 그릴 수 있는 컨트롤의 형식을 지정 하.

   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 이상과 button 컨트롤의 배경색을 변경 하려면 소유자 그리기 단추를 만드는 데 필요한 됩니다.


브러시 핸들 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 메시지는 컨트롤의 다음 다섯 개의 클래스에도 적용 됩니다.


  1. 확인란, 라디오 단추 및 누름 단추: 선택한 브러시로; 컨트롤 배치 됩니다 사각형 영역을 그립니다. 컨트롤 모양 및 텍스트 위에 채색된 된 패턴 테두리를 그립니다.
  2. 컨트롤 편집: 편집 영역을 그립니다.
  3. 그룹 상자: 제목 텍스트 뒤에 사각형 영역을 그립니다.
  4. 스크롤 막대: 엄지 트랙 주위의 영역을 그립니다.
  5. 목록 상자: 목록 영역을 그립니다.
정적 텍스트, 프레임 및 사각형 WM_CTLCOLOR 영향을 받지 않습니다.


참고: Windows 3.0에서 응용 프로그램 단추 모양에 색을 변경할 수 없습니다. 그러나 사용자 시스템의 모든 응용 프로그램에 대 한 단추 색을 변경 하려면 제어판을 사용할 수 있습니다. 이 승의 [색] 섹션을 수정 하 여 수행할 수도 있습니다. INI 파일에 추가 된 "ButtonFace =" 단추 표면 색에 대 한 RGB 색상 값을 지정 하는 줄.


응용 프로그램에서 만든 자식 창의 색만 변경 WM_CTLCOLOR 메시지를 처리 합니다. Windows에서는 이러한 각 컨트롤의 부모 창에 WM_CTLCOLOR 메시지를 보냅니다. 스크롤 막대의 일부로 windows에 포함 된 컨트롤을 편집 또는 목록 상자 영향을 받지 않습니다. 시스템 생성 스크롤 막대 엄지 트랙 영역에서 승리만 변경할 수 있습니다. 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);

...

이 코드는 전체 대화 상자에서 무늬 비트맵 제대로 일렬로 것을 보장 합니다. "MyPatternBrush"은 SDKPaint를 사용 하 여 만든 비트맵의 이름입니다. 이 비트맵에 포함 되어야 하면. RC 파일입니다.
속성

문서 ID: 32685 - 마지막 검토: 2017. 2. 7. - 수정: 1

피드백