다음을 통해 공유


사용자 지정 그리기 정보

이 섹션에는 사용자 지정 그리기 기능에 대한 일반 정보가 포함되어 있으며 애플리케이션이 사용자 지정 그리기를 지원할 수 있는 방법에 대한 개념적 개요를 제공합니다. 현재 다음 컨트롤은 사용자 지정 그리기 기능을 지원합니다.

  • 헤더 컨트롤
  • 목록 뷰 컨트롤
  • rebar 컨트롤
  • 도구 모음 컨트롤
  • 도구 설명 컨트롤
  • 트랙바 컨트롤
  • 트리 뷰 컨트롤

사용자 지정 그리기 알림 메시지 정보

사용자 지정 그리기를 지원하는 모든 공용 컨트롤은 그리기 작업 중 특정 지점에서 NM_CUSTOMDRAW 알림 코드를 보냅니다. 이러한 알림 코드는 전체 컨트롤에 적용되는 그리기 작업과 컨트롤 내의 항목에 특정한 그리기 작업을 설명합니다. 많은 알림 코드와 마찬가지로 NM_CUSTOMDRAW 알림은 WM_NOTIFY 메시지로 전송됩니다.

사용자 지정 그리기 알림의 lParam 매개 변수는 NMCUSTOMDRAW 구조체의 주소 또는 NMCUSTOMDRAW 구조체를 첫 번째 멤버로 포함하는 컨트롤별 구조체여야 합니다. 다음 표는 컨트롤과 컨트롤이 사용하는 구조체 간의 관계를 보여 줍니다.

구조체 사용 대상
NMCUSTOMDRAW rebar, 트랙바 및 헤더 컨트롤
NMLVCUSTOMDRAW 목록 뷰 컨트롤
NMTBCUSTOMDRAW 도구 모음 컨트롤
NMTTCUSTOMDRAW 도구 설명 컨트롤
NMTVCUSTOMDRAW 트리 뷰 컨트롤

 

페인트 주기, 그리기 단계 및 알림 메시지

모든 Windows 애플리케이션과 마찬가지로 공용 컨트롤은 시스템이나 다른 애플리케이션에서 받은 메시지를 기반으로 주기적으로 자신을 그리고 지웁니다. 컨트롤 페인팅 또는 자체 지우기 프로세스를 페인트 주기라고 합니다. 사용자 지정 그리기를 지원하는 컨트롤은 각 그리기 주기를 통해 주기적으로 NM_CUSTOMDRAW 알림 코드를 보냅니다. 이 알림 코드는 NMCUSTOMDRAW 구조체 또는 NMCUSTOMDRAW 구조체를 첫 번째 멤버로 포함하는 다른 구조체와 함께 제공됩니다.

NMCUSTOMDRAW 구조체에 포함된 정보 중 하나는 페인트 주기의 현재 단계입니다. 이를 그리기 단계라고 하며 구조체의 dwDrawStage 멤버 값으로 표현됩니다. 컨트롤은 네 가지 기본 그리기 단계에 대해 부모에게 알립니다. 이러한 기본 또는 전역 그리기 단계는 구조체에서 다음 플래그 값(Commctrl.h에 정의됨)으로 표시됩니다.

전역 그리기 단계 값 설명
CDDS_PREPAINT 페인트 주기가 시작하기 전.
CDDS_POSTPAINT 페인트 주기가 완료된 후.
CDDS_PREERASE 지우기 주기가 시작하기 전.
CDDS_POSTERASE 지우기 주기가 완료된 후.

 

위의 각 값을 CDDS_ITEM 플래그와 결합하여 항목별 그리기 단계를 지정할 수 있습니다. 편의상 Commctrl.h에는 다음과 같은 항목별 값이 포함되어 있습니다.

항목별 그리기 단계 값 설명
CDDS_ITEMPREPAINT 항목을 그리기 전.
CDDS_ITEMPOSTPAINT 항목을 그린 후.
CDDS_ITEMPREERASE 항목을 지우기 전.
CDDS_ITEMPOSTERASE 항목을 지운 후.
CDDS_SUBITEM 공용 컨트롤 버전 4.71. 하위 항목을 그린 경우 CDDS_ITEMPREPAINT 또는 CDDS_ITEMPOSTPAINT와 결합된 플래그입니다. CDRF_NOTIFYITEMDRAW가 CDDS_PREPAINT에서 반환된 경우에만 설정됩니다.

 

애플리케이션은 NM_CUSTOMDRAW 알림 코드를 처리한 다음 컨트롤에 해야 할 일을 알려 주는 특정 값을 반환해야 합니다. 이러한 반환 값에 대한 자세한 내용은 다음 섹션을 참조하세요.

사용자 지정 그리기 서비스 활용

사용자 지정 그리기 기능을 활용하는 핵심은 컨트롤이 보내는 NM_CUSTOMDRAW 알림 코드에 응답하는 것입니다. 이러한 알림에 대한 응답으로 애플리케이션이 보내는 반환 값은 해당 페인트 주기에 대한 컨트롤의 동작을 결정합니다.

이 섹션에는 애플리케이션이 NM_CUSTOMDRAW 알림 반환 값을 사용하여 컨트롤의 동작을 결정하는 방법에 대한 정보가 포함되어 있습니다.

세부 정보는 다음 항목으로 나뉩니다.

미리 그리기 알림에 응답

각 페인트 주기가 시작될 때 컨트롤은 함께 제공되는 NM_CUSTOMDRAW 구조체의 dwDrawStage 멤버에 CDDS_PREPAINT 값을 지정하여 NM_CUSTOMDRAW 알림 코드를 보냅니다. 애플리케이션이 이 첫 번째 알림에 반환하는 값은 컨트롤이 해당 페인트 주기의 나머지 부분에 대한 후속 사용자 지정 그리기 알림을 보내는 방법과 시기를 나타냅니다. 애플리케이션은 첫 번째 알림에 대한 응답으로 다음 플래그 조합을 반환할 수 있습니다.

반환 값 영향
CDRF_DODEFAULT 컨트롤이 자체적으로 그려집니다. 이 페인트 주기에 대한 추가 NM_CUSTOMDRAW 알림을 보내지 않습니다. 이 플래그는 다른 플래그와 함께 사용할 수 없습니다.
CDRF_DOERASE 컨트롤은 배경만 그립니다.
CDRF_NEWFONT 애플리케이션이 항목에 대한 새 글꼴을 지정했습니다. 컨트롤은 새 글꼴을 사용합니다. 글꼴 변경에 대한 자세한 내용은 글꼴 및 색 변경을 참조하세요. 이는 dwDrawStage가 CDDS_ITEMPREPAINT와 같을 때 발생합니다.
CDRF_NOTIFYITEMDRAW 컨트롤은 항목별 그리기 작업을 부모에게 알립니다. 항목을 그리기 전후에 NM_CUSTOMDRAW 알림 코드를 보냅니다. 이는 dwDrawStage가 CDDS_PREPAINT와 같을 때 발생합니다.
CDRF_NOTIFYPOSTERASE 컨트롤은 항목을 지운 후 부모에게 알립니다. 이는 dwDrawStage가 CDDS_PREPAINT와 같을 때 발생합니다.
CDRF_NOTIFYPOSTPAINT 컨트롤은 전체 컨트롤의 그리기 주기가 완료되면 NM_CUSTOMDRAW 알림을 보냅니다. 이는 dwDrawStage가 CDDS_PREPAINT와 같을 때 발생합니다.
CDRF_NOTIFYSUBITEMDRAW 버전 4.71. 애플리케이션은 dwDrawStage가 각 목록 뷰 하위 항목이 그려지기 전에 CDDS_ITEMPREPAINT | CDDS_SUBITEM으로 설정된 NM_CUSTOMDRAW 알림을 수신합니다. 그런 다음 각 하위 항목의 글꼴과 색을 개별적으로 지정하거나 기본 처리를 위해 CDRF_DODEFAULT를 반환할 수 있습니다. 이는 dwDrawStage가 CDDS_ITEMPREPAINT와 같을 때 발생합니다.
CDRF_SKIPDEFAULT 애플리케이션이 항목을 수동으로 그렸습니다. 컨트롤은 항목을 그리지 않습니다. 이는 dwDrawStage가 CDDS_ITEMPREPAINT와 같을 때 발생합니다.
CDRF_SKIPPOSTPAINT 컨트롤은 항목 주위에 포커스 사각형을 그리지 않습니다.

 

항목별 알림 요청

애플리케이션이 초기 미리 그리기 사용자 지정 그리기 알림에 CDRF_NOTIFYITEMDRAW를 반환하면 컨트롤은 해당 그리기 주기 동안 그리는 각 항목에 대한 알림을 보냅니다. 이러한 항목별 알림은 수반되는 NMCUSTOMDRAW 구조체의 dwDrawStage 멤버에 CDDS_ITEMPREPAINT 값을 갖습니다. 이러한 항목별 알림에 CDRF_NOTIFYPOSTPAINT를 반환하여 컨트롤이 항목 그리기를 마쳤을 때 다른 알림을 보내도록 요청할 수 있습니다. 그렇지 않으면 CDRF_DODEFAULT를 반환하고 컨트롤은 다음 항목 그리기를 시작할 때까지 부모 창에 알리지 않습니다.

항목을 직접 그리기

애플리케이션이 전체 항목을 그리는 경우 CDRF_SKIPDEFAULT를 반환합니다. 이렇게 하면 컨트롤이 그릴 필요가 없는 항목을 건너뛸 수 있으므로 시스템 오버헤드가 줄어듭니다. 이 값을 반환하면 컨트롤이 항목의 어떤 부분도 그리지 않는다는 사실에 유의해야 합니다.

글꼴 및 색 변경

애플리케이션은 사용자 지정 그리기를 사용하여 항목의 글꼴을 변경할 수 있습니다. 사용자 지정 그리기 알림과 연결된 NMCUSTOMDRAW 구조체의 hdc 멤버가 지정한 디바이스 컨텍스트에 원하는 HFONT를 선택하기만 하면 됩니다. 선택한 글꼴은 기본 글꼴과 메트릭이 다를 수 있으므로 알림 메시지의 반환 값에 CDRF_NEWFONT 비트를 포함해야 합니다. 이 기능 사용에 대한 자세한 내용은 사용자 지정 그리기 사용의 샘플 코드를 참조하세요. 애플리케이션이 지정하는 글꼴은 선택되지 않은 항목을 표시하는 데 사용됩니다. 사용자 지정 그리기에서는 선택한 항목의 글꼴 특성을 변경할 수 없습니다.

목록 뷰 및 트리 뷰를 제외하고 사용자 지정 그리기를 지원하는 모든 컨트롤의 텍스트 색을 변경하려면 SetTextColorSetBkColor 함수를 사용하여 사용자 지정 그리기 알림 구조체에 제공된 디바이스 컨텍스트에서 원하는 텍스트 및 배경색을 설정하기만 하면 됩니다. 목록 뷰 또는 트리 뷰에서 텍스트 색을 수정하려면 NMLVCUSTOMDRAW 또는 NMTVCUSTOMDRAW 구조체의 clrTextclrTextBk 멤버에 원하는 색 값을 배치해야 합니다.

참고

공용 컨트롤의 버전 6.0 이전에는 도구 모음이 CDRF_NEWFONT 플래그를 무시합니다. 버전 6.0은 CDRF_NEWFONT 플래그를 지원하며 이를 사용하여 도구 모음에 대해 다른 글꼴을 선택할 수 있습니다. 그러나 시각적 스타일이 활성화되어 있으면 도구 모음의 색을 변경할 수 없습니다. 버전 6.0에서 도구 모음의 색을 변경하려면 먼저 SetWindowTheme를 호출하고 시각적 스타일을 지정하지 않음으로써 시각적 스타일을 사용하지 않도록 설정해야 합니다.

 

SetWindowTheme (hwnd, "", "");

목록 뷰 및 트리 뷰 컨트롤이 있는 사용자 지정 그리기

대부분의 공용 컨트롤은 기본적으로 동일한 방식으로 처리할 수 있습니다. 그러나 목록 뷰 및 트리 뷰 컨트롤에는 사용자 지정 그리기에 대해 다소 다른 방식이 필요한 일부 기능이 있습니다.

버전 5.0의 경우 CDRF_NEWFONT를 반환하여 글꼴을 변경하면 이 두 컨트롤에 잘린 텍스트가 표시될 수 있습니다. 이 동작은 이전 버전의 공용 컨트롤과의 호환성을 위해 필요합니다. 목록 뷰 또는 트리 뷰 컨트롤의 글꼴을 변경하려는 경우 컨트롤에 항목을 추가하기 전에 wParam 값이 5로 설정된 CCM_SETVERSION 메시지를 보내면 더 나은 결과를 가져올 수 있습니다. 사용자 지정 그리기를 사용하는 트리 뷰 컨트롤의 예는 기술 자료 문서 샘플: CustDTv가 TreeView에서 사용자 지정 그리기를 설명함(Q248496)을 참조하세요.

목록 뷰 컨트롤을 사용한 사용자 지정 그리기

목록 뷰 컨트롤에는 하위 항목과 여러 디스플레이 모드가 있으므로 NM_CUSTOMDRAW 알림을 다른 공용 컨트롤과는 다소 다르게 처리해야 합니다.

보고서 모드의 경우 다음 프로시저를 따릅니다.

  1. 첫 번째 NM_CUSTOMDRAW 알림에는 연결된 NMCUSTOMDRAW 구조체의 dwDrawStage 멤버가 CDDS_PREPAINT로 설정됩니다. CDRF_NOTIFYITEMDRAW를 반환합니다.
  2. 그러면 dwDrawStage가 CDDS_ITEMPREPAINT로 설정된 NM_CUSTOMDRAW 알림을 받게 됩니다. 새 글꼴이나 색을 지정하고 CDRF_NEWFONT를 반환하면 항목의 모든 하위 항목이 변경됩니다. 대신 각 하위 항목을 개별적으로 처리하려면 CDRF_NOTIFYSUBITEMDRAW를 반환합니다.
  3. 이전 단계에서 CDRF_NOTIFYSUBITEMDRAW를 반환한 경우 dwDrawStage가 CDDS_SUBITEM | CDDS_ITEMPREPAINT로 설정된 각 하위 항목에 대한 NM_CUSTOMDRAW 알림을 받게 됩니다. 해당 하위 항목의 글꼴 또는 색을 변경하려면 새 글꼴 또는 색을 지정하고 CDRF_NEWFONT를 반환합니다.

큰 아이콘, 작은 아이콘 및 목록 모드의 경우 다음 프로시저를 따릅니다.

  1. 첫 번째 NM_CUSTOMDRAW 알림에는 연결된 NMCUSTOMDRAW 구조체의 dwDrawStage 멤버가 CDDS_PREPAINT로 설정됩니다. CDRF_NOTIFYITEMDRAW를 반환합니다.
  2. 그러면 dwDrawStage가 CDDS_ITEMPREPAINT로 설정된 NM_CUSTOMDRAW 알림을 받게 됩니다. 새 글꼴과 색을 지정하고 CDRF_NEWFONT를 반환하여 항목의 글꼴이나 색을 변경할 수 있습니다. 이러한 모드에는 하위 항목이 없기 때문에 추가 NM_CUSTOMDRAW 알림을 받지 않습니다.

목록 뷰 NM_CUSTOMDRAW 알림 처리기의 예는 사용자 지정 그리기 사용을 참조하세요.

개념

사용자 지정 그리기 사용

사용자 지정 그리기 참조

기타 리소스

샘플: CustDTv는 TreeView에서 사용자 지정 그리기를 보여 줍니다(Q248496).