다음을 통해 공유


사용자 지정 그리기에 대해

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

  • 헤더 제어
  • 목록 보기 컨트롤
  • Rebar 제어
  • 도구 모음 컨트롤
  • 툴팁 제어
  • 트랙바 컨트롤
  • 트리 뷰 컨트롤

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

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

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

구조 에 의해 사용됨
NMCUSTOMDRAW 리바, 트랙바 및 헤더 컨트롤
NMLVCUSTOMDRAW 목록 보기 컨트롤
NMTBCUSTOMDRAW 도구 모음 컨트롤
NMTTCUSTOMDRAW 툴팁 컨트롤
NMTVCUSTOMDRAW 트리 뷰 컨트롤

 

그림판 주기, 그리기 단계 및 알림 메시지

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

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

전역 드로 스테이지 값 묘사
CDDS_PREPAINT 페인트 주기가 시작되기 전에.
CDDS_POSTPAINT 페인트 주기가 완료된 후
CDDS_PREERASE 지우기 주기가 시작되기 전에.
CDDS_POSTERASE 지우기 주기가 완료된 후

 

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

항목별 그리기 단계 값 묘사
CDDS_ITEMPREPAINT 항목을 그리기 전에
CDDS_ITEMPOSTPAINT 항목을 그린 후
CDDS_ITEMPREERASE 항목이 지워지기 전에.
CDDS_ITEMPOSTERASE 항목이 지워진 후에
CDDS_서브아이템 공용 컨트롤 버전 4.71 입니다. 하위 항목이 그려질 경우, CDDS_ITEMPREPAINT 또는 CDDS_ITEMPOSTPAINT와 결합된 플래그입니다. CDRF_NOTIFYITEMDRAW 값이 CDDS_PREPAINT에서 반환되는 경우에만 설정됩니다.

 

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

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

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

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

세부 정보는 다음 항목으로 구분됩니다.

도색 사전 알림에 응답

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

반환 값 효과
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, "", "");

List-View 및 Tree-View 컨트롤을 사용하여 사용자 지정 그리기

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

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

List-View 컨트롤을 사용하여 사용자 지정 그리기

목록 보기 컨트롤에는 하위 항목과 여러 표시 모드가 있으므로 다른 일반 컨트롤과는 약간 다르게 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) 사용자 지정 그리기를 보여 줍니다.