다음을 통해 공유


색 대화 상자

사용자가 특정 색 값을 선택할 수 있는 모달 대화 상자를 표시합니다. 사용자는 기본 또는 사용자 지정 색상표 집합에서 색을 선택할 수 있습니다. 또는 사용자가 대화 상자 사용자 인터페이스의 RGB 또는 색조, 채도, 광도(HSL) 색 값을 수정하여 색 값을 생성할 수 있습니다. 대화 상자는 사용자가 선택한 색의 RGB 값을 반환합니다.

CHOOSECOLOR 구조를 초기화하고 구조를 ChooseColor 함수에 전달하여 대화 상자를 만들고 표시합니다. CHOOSECOLOR 구조체에 대해 다른 매개 변수 값을 설정하면 색 대화 상자가 표시되는 방식에 영향을 줄 수 있습니다. 예를 들어 대화 상자의 전체 또는 부분 사용자 인터페이스 버전을 표시할 수 있습니다. 다음 그림에서는 대화 상자의 전체 사용자 인터페이스 버전을 보여 줍니다.

색 대화 상자

사용자가 확인 단추를 클릭하면 ChooseColorTRUE를 반환합니다. CHOOSECOLOR 구조체의 rgbResult 멤버에는 사용자가 선택한 색의 RGB 색 값이 포함됩니다. RGB 색 값은 선택한 색을 구성하는 개별 빨강, 녹색 및 파랑 색의 강도를 지정합니다. 개별 값의 범위는 0에서 255까지입니다. GetRValue, GetGValueGetBValue 매크로를 사용하여 RGB 색 값에서 개별 색을 추출합니다.

사용자가 대화 상자를 취소하거나 오류가 발생하면 ChooseColorFALSE 를 반환하고 rgbResult 멤버는 정의되지 않습니다. 오류의 원인을 확인하려면 CommDlgExtendedError 함수를 호출하여 확장된 오류 값을 검색합니다.

다음 주제는 이 섹션에서 다룹니다.

전체 및 부분 색 대화 상자

색 대화 상자에는 전체 버전과 사용자 인터페이스의 부분 버전이 있습니다. 전체 버전에는 기본 컨트롤이 포함되며 사용자가 사용자 지정 색을 만들 수 있는 추가 컨트롤이 있습니다. 부분 버전에는 사용자가 색 값을 선택할 수 있는 기본 및 사용자 지정 색 팔레트를 표시하는 컨트롤이 있습니다.

색 대화 상자의 부분 버전에는 사용자 지정 색 정의 단추가 포함되어 있습니다. 사용자는 이 단추를 클릭하여 전체 버전을 표시할 수 있습니다. CHOOSECOLOR 구조체의 Flags 멤버에서 CC_FULLOPEN 플래그를 설정하여 항상 전체 버전을 표시하도록 색 대화 상자를 지시할 수 있습니다. 사용자가 사용자 지정 색을 만들지 못하도록 하려면 CC_PREVENTFULLOPEN 플래그를 설정하여 사용자 지정 색 정의 단추를 사용하지 않도록 설정할 수 있습니다.

기본 색은 지정된 디바이스에서 사용할 수 있는 색의 선택을 나타냅니다. 표시되는 실제 색 수는 디스플레이 드라이버에 의해 결정됩니다. 예를 들어 VGA 드라이버는 48가지 색을 표시하고 단색 디스플레이 드라이버는 16개만 표시합니다.

사용자 지정 색은 사용자가 지정하거나 사용자가 만드는 색입니다. 색 대화 상자를 만들 때 CHOOSECOLOR 구조체의 lpCustColors 멤버를 사용하여 16가지 사용자 지정 색의 초기 값을 지정해야 합니다. 색 대화 상자의 전체 버전이 열려 있는 경우 사용자는 다음 방법 중 하나로 사용자 지정 색을 만들 수 있습니다.

  • 색 스펙트럼 컨트롤 및 광도 슬라이드 컨트롤에서 커서 이동
  • 빨강, 녹색파랑 편집 컨트롤에 RGB 값 입력
  • Hue, SatLum 편집 컨트롤에 HSL 값 입력

사용자 지정 색 표시에 새 사용자 지정 색을 추가하려면 사용자 지정 색에 추가 단추를 클릭할 수 있습니다. 그러면 대화 상자에서 새 색의 RGB 값을 lpCustColors 멤버가 가리키는 배열의 해당 요소에 복사합니다. ChooseColor 호출 간에 새 사용자 지정 색을 유지하려면 배열에 정적 메모리를 할당해야 합니다. RGB 및 HSL 색 모델에 대한 자세한 내용은 색 대화 상자에서 사용하는 색 모델을 참조하세요.

색 대화 상자 사용자 지정

색 대화 상자를 사용자 지정하려면 다음 방법 중 원하는 방법을 사용할 수 있습니다.

  • 대화 상자를 만들 때 CHOOSECOLOR 구조에 값 지정
  • 사용자 지정 템플릿 제공
  • 후크 프로시저 제공

CHOOSECOLOR 구조체의 Flags 멤버에서 플래그를 설정하여 색 대화 상자의 모양과 동작을 수정할 수 있습니다. 예를 들어 CC_SOLIDCOLOR 플래그를 설정하여 단색만 표시하도록 대화 상자를 지시할 수 있습니다. 대화 상자가 처음에 검은색 이외의 색을 선택하도록 하려면 CC_RGBINIT 플래그를 설정하고 rgbResult 멤버에 색을 지정합니다.

예를 들어 애플리케이션에 고유한 추가 컨트롤을 포함하려는 경우 색 대화 상자에 대한 사용자 지정 템플릿을 제공할 수 있습니다. ChooseColor 함수는 기본 템플릿 대신 사용자 지정 템플릿을 사용합니다.

색 대화 상자에 대한 사용자 지정 템플릿을 제공하려면

  1. Color.dlg 파일에 지정된 기본 템플릿을 수정하여 사용자 지정 템플릿을 만듭니다. 기본 색 대화 상자 템플릿에 사용되는 컨트롤 식별자는 Color.dlg 파일에 정의되어 있습니다.
  2. CHOOSECOLOR 구조를 사용하여 다음과 같이 템플릿을 사용하도록 설정합니다.
    • 사용자 지정 템플릿이 애플리케이션 또는 동적 링크 라이브러리의 리소스인 경우 Flags 멤버에서 CC_ENABLETEMPLATE 플래그를 설정합니다. 구조체의 hInstancelpTemplateName 멤버를 사용하여 모듈 및 리소스 이름을 식별합니다.

      -또는-

    • 사용자 지정 템플릿이 이미 메모리에 있는 경우 CC_ENABLETEMPLATEHANDLE 플래그를 설정합니다. hInstance 멤버를 사용하여 템플릿이 포함된 메모리 개체를 식별합니다.

색 대화 상자에 CCHookProc 후크 프로시저를 제공할 수 있습니다. 후크 프로시저는 대화 상자로 전송된 메시지를 처리할 수 있습니다. 등록된 메시지를 사용하여 대화 상자의 동작을 제어할 수도 있습니다. 사용자 지정 템플릿을 사용하여 추가 컨트롤을 정의하는 경우 컨트롤에 대한 입력을 처리하는 후크 프로시저를 제공해야 합니다.

색 대화 상자에 후크 프로시저를 사용하도록 설정하려면

  1. CHOOSECOLOR 구조체의 Flags 멤버에서 CC_ENABLEHOOK 플래그를 설정합니다.
  2. lpfnHook 멤버에서 후크 프로시저의 주소를 지정합니다.

WM_INITDIALOG 메시지를 처리한 후 대화 상자 프로시저는 후크 프로시저에 WM_INITDIALOG 메시지를 보냅니다. 이 메시지의 lParam 매개 변수는 대화 상자를 초기화하는 데 사용되는 CHOOSECOLOR 구조체에 대한 포인터입니다.

대화 상자는 사용자가 확인 단추를 클릭할 때 COLOROKSTRING 등록된 메시지를 후크 프로시저로 보냅니다. 후크 프로시저는 선택한 색을 거부하고 이 메시지를 받을 때 0을 반환하여 대화 상자를 열어 두도록 할 수 있습니다. 후크 프로시저는 SETRGBSTRING 등록된 메시지를 대화 상자에 보내 대화 상자에서 특정 색을 선택하도록 강제할 수 있습니다. 이러한 등록된 메시지를 사용하려면 COLOROKSTRINGSETRGBSTRING 상수를 RegisterWindowMessage 함수에 전달하여 메시지 식별자를 가져와야 합니다. 그런 다음 식별자를 사용하여 대화 상자에서 보낸 메시지를 검색하고 처리하거나 대화 상자로 메시지를 보낼 수 있습니다.

색 대화 상자에서 사용되는 색 모델

색 대화 상자의 사용자 지정 색 확장을 사용하면 사용자가 RGB 또는 HSL 값을 사용하여 색을 지정할 수 있습니다. 그러나 SELECTCOLOR 구조는 RGB 값만 사용하여 사용자가 만들거나 선택한 색을 보고합니다.

RGB 색 모델

RGB 모델은 디스플레이 및 빛을 방출하는 다른 디바이스의 색을 지정하는 데 사용됩니다. 유효한 빨간색, 녹색 및 파란색 값은 0부터 255까지이며, 0은 최소 강도를 나타내고 255는 최대 강도를 나타냅니다. 다음 그림에서는 기본 색을 빨강, 녹색 및 파란색으로 결합하여 4가지 추가 색을 생성하는 방법을 보여 줍니다. (디스플레이 디바이스의 경우 빨간색, 녹색 및 파란색 값이 0으로 설정된 경우 검은색으로 표시됩니다. 디스플레이 기술에서 검은색은 모든 색이 없습니다.)

겹치는 빨간색, 녹색 및 파란색 원

다음 표에는 RGB 모델의 8가지 색과 관련 RGB 값이 나와 있습니다.

색상 RGB 값
빨간색 255, 0, 0
녹색 0, 255, 0
파랑 0, 0, 255
녹청 0, 255, 255
자홍 255, 0, 255
노란색 255, 255, 0
흰색 255, 255, 255
검정 0, 0, 0

 

시스템은 내부 색을 16진수 형식인 0x00bbggrr인 32비트 RGB 값으로 저장합니다.

낮은 순서 바이트에는 빨간색의 상대적 강도에 대한 값이 포함됩니다. 두 번째 바이트에는 녹색 값이 포함됩니다. 세 번째 바이트에는 파란색 값이 포함됩니다. 상위 바이트는 0이어야 합니다.

RGB 매크로를 사용하여 빨간색, 녹색 및 파란색 구성 요소에 대해 지정된 강도에 따라 RGB 값을 가져올 수 있습니다. GetRValue, GetBValueGetGValue 매크로를 사용하여 RGB 색 값에서 개별 색을 추출합니다.

HSL 색 모델

색 대화 상자는 HSL 값을 지정하기 위한 컨트롤을 제공합니다. 다음 그림에서는 색 대화 상자에 나타나는 색 스펙트럼 컨트롤과 광도 슬라이드 컨트롤을 보여 줍니다. 또한 이 그림에서는 사용자가 이러한 컨트롤을 사용하여 지정할 수 있는 값의 범위를 보여 줍니다.

색 스펙트럼 및 광도 눈금

색 대화 상자에서 채도 및 광도 값은 0~240 범위에 있어야 하며 색조 값은 0~239 범위에 있어야 합니다.

HSL 값을 RGB 값으로 변환

색 대화 상자의 Comdlg32.dll 제공된 대화 상자 프로시저에는 HSL 값을 해당 RGB 값으로 변환하는 코드가 포함되어 있습니다. 다음 표에는 RGB 모델의 8가지 색과 관련 HSL 및 RGB 값이 나와 있습니다.

색상 HSL 값 RGB 값
빨간색 (0, 240, 120) (255, 0, 0)
노란색 (40, 240, 120) (255, 255, 0)
녹색 (80, 240, 120) (0, 255, 0)
녹청 (120, 240, 120) (0, 255, 255)
파랑 (160, 240, 120) (0, 0, 255)
자홍 (200, 240, 120) (255, 0, 255)
흰색 (0, 0, 240) (255, 255, 255)
검정 (0, 0, 0) (0, 0, 0)