DEVMODEW 구조체

DEVMODEW 구조체는 Microsoft Windows SDK 설명서에 설명된 DEVMODE 구조체의 유니코드 버전입니다. (DEVMODEW의 'W' 접미사는 "wide" 또는 유니코드 문자를 의미합니다.) 애플리케이션은 두 구조체 중 하나를 사용할 수 있지만 드라이버는 DEVMODE 구조가 아닌 DEVMODEW 구조를 사용해야 합니다.

퍼블릭 및 프라이빗 멤버

DEVMODEW 구조체의 정의된 멤버(공용 DEVMODEW 멤버라고도 함) 바로 다음에 드라이버 정의 멤버 집합(프라이빗 DEVMODEW 멤버)이 있을 수 있습니다. 다음 그림에서는 공개 섹션(실제 DEVMODEW 구조 자체) 및 프라이빗 섹션을 보여 줍니다.

DEVMODEW 구조체의 퍼블릭 및 프라이빗 섹션을 보여 주는 다이어그램

일반적으로 프라이빗 멤버는 프린터 드라이버에서만 사용됩니다. 드라이버는 dmDriverExtra 멤버에서 이 개인 영역의 크기(바이트)를 제공합니다. 드라이버 정의 프라이빗 멤버는 드라이버에서 단독으로 사용합니다.

프린터 드라이버의 경우 DEVMODEW 구조는 인쇄 문서에 대한 사용자 선택 항목을 지정하는 데 사용됩니다. 인쇄할 복사본 수, 용지 크기 및 기타 특성과 같은 프린터에 대해 이러한 선택 항목의 기본값을 지정하는 데도 사용됩니다. 디스플레이 디바이스의 경우 DEVMODEW 구조는 픽셀당 비트 수, 픽셀 차원 및 디스플레이 빈도와 같은 표시 특성을 지정합니다.

DEVMODEW 구조 초기화

디스플레이 드라이버 또는 프린터 드라이버에서 사용할지 여부에 따라 DEVMODEW 구조체는 두 가지 방법으로 초기화됩니다.

  • 드라이버 DEVMODEW 초기화 표시

    디스플레이 드라이버의 DrvGetModes 진입점은 DEVMODEW 구조체의 모든 멤버를 0으로 초기화합니다. 그런 다음 DrvGetModes 는 디스플레이 드라이버 DLL의 이름을 dmDeviceName 멤버에 복사하고, dmSpecVersiondmDriverVersion 멤버를 DEVMODEW 구조의 버전으로 채우고, 표시 특성 정보를 적절한 멤버에게 복사합니다.

  • 프린터 드라이버 DEVMODEW 초기화

    애플리케이션이 DocumentProperties(Microsoft Windows SDK 설명서에 설명된 프린터 인터페이스 DLL 함수) 또는 DrvDocumentPropertySheets(NT 기반 운영 체제 그래픽 DDI)를 호출하면 DEVMODEW 구조체가 기본값으로 만들어집니다. 그러면 애플리케이션에서 공용 DEVMODEW 멤버를 자유롭게 수정할 수 있습니다. 변경된 멤버를 드라이버의 내부 DEVMODEW 구조체와 병합하려면 애플리케이션이 이전에 호출한 것과 동일한 함수를 두 번째로 호출해야 합니다. 일부 변경 내용이 제대로 작동하지 않을 수 있으므로 두 번째 호출이 필요합니다. DEVMODEW 구조를 수정하려면 프린터 드라이버를 호출해야 합니다. 문서를 인쇄하려고 하면 애플리케이션은 병합된 DEVMODEW 구조를 CreateDC(Microsoft Windows SDK 설명서에 설명됨)에 전달하여 DrvEnablePDEV DDI에 전달합니다. 이때 드라이버의 렌더링 DLL은 DEVMODEW 구조의 유효성을 검사하고 필요한 경우 인쇄 작업을 수행하기 전에 복구합니다.

DEVMODEW 구조체 사용

여러 API 및 그래픽 DDI는 인쇄, 디바이스 기능 쿼리, 사용자 인터페이스 표시 등의 목적으로 DEVMODEW 구조의 정보를 사용합니다. 예를 들어 DrvConvertDevMode 는 DEVMODEW 구조를 한 운영 체제 버전에서 다른 운영 체제 버전으로 변환하는 인쇄 스풀러 그래픽 DDI입니다. 프린터 드라이버가 다른 운영 체제 버전에서 실행 중인 다른 컴퓨터에서 DEVMODEW 구조를 가져오는 경우 필요할 수 있습니다.

DEVMODEW 구조 수정

애플리케이션 및 드라이버는 자유롭게 DEVMODEW 구조를 요청하고 공용 부분을 직접 수정할 수 있습니다. 그러나 드라이버만 프라이빗 DEVMODEW 구조체 멤버를 수정할 수 있습니다.

프라이빗 DEVMODEW 구조체 멤버를 수정하려면 먼저 드라이버가 프라이빗 데이터의 시작 부분의 오프셋을 결정해야 합니다. 이 구조체의 시작 부분에 대한 포인터와 구조체의 public 부분의 크기를 포함하는 dmSize 멤버를 지정하면 프라이빗 부분의 시작 부분을 찾을 수 있습니다. 다음 예제에서는 프라이빗 섹션의 시작 부분에 대한 포인터를 초기화하는 방법을 보여줍니다. 이 예제에서 pdm 은 DEVMODEW 구조체의 시작을 가리킵니다.

PVOID pvDriverData = (PVOID)  (((BYTE *) pdm) + (pdm -> dmSize));

프린터 드라이버/디스플레이 드라이버 DEVMODEW 차이점

DEVMODEW 구조체 멤버는 다음 세 가지 범주로 구분됩니다.

  • 프린터 드라이버에서만 사용되는 멤버

  • 디스플레이 드라이버에서만 사용되는 멤버

  • 프린터 및 디스플레이 드라이버에서 사용하는 멤버

다음 표에는 프린터 드라이버 에서만 사용되는 여러 공용 DEVMODEW 멤버가 나와 있습니다.

프린터 드라이버에서만 사용 목적
dmScale 인쇄를 위해 이미지 크기를 조정할 비율을 지정합니다.
dmCopies 인쇄할 복사본 수를 지정합니다.
dmColor 컬러 프린터에서 색 또는 단색을 인쇄할지 여부를 지정합니다.
dmOrientation 세로 또는 가로 용지의 방향을 지정합니다.

다음 표에는 디스플레이 드라이버 에서만 사용되는 여러 공용 DEVMODEW 멤버가 나와 있습니다.

디스플레이 드라이버에서만 사용 목적
dmBitsPerPel 디스플레이 디바이스의 색 해상도(픽셀당 비트)를 지정합니다.
dmPelsWidth 표시되는 디바이스 표면의 너비를 픽셀 단위로 지정합니다.
dmPelsHeight 표시되는 디바이스 표면의 높이를 픽셀 단위로 지정합니다.
dmDisplayFlags 표시 모드(색 대 단색, 인터레이스 및 비인터레이스됨)를 지정합니다.
dmDisplayFrequency 헤르츠에서 디스플레이의 새로 고침 빈도를 지정합니다.

세 번째 표에는 프린터 및 디스플레이 드라이버에서 사용하는 여러 공용 DEVMODEW 멤버가 나와 있습니다.

프린터 및 디스플레이 드라이버에서 사용 목적
dmDeviceName 디스플레이의 경우 디스플레이 드라이버의 DLL을 지정합니다. 프린터의 경우 프린터의 "식별 이름"을 지정합니다.
dmFields 사용 중인 DEVMODEW 멤버를 식별하는 비트 플래그를 지정합니다. 예를 들어 dmBitsPerPel 멤버에 유효한 데이터가 포함된 경우 DM_BITSPERPEL 플래그가 설정됩니다.
dmSize DEVMODEW 구조체의 공용 부분의 크기(바이트)를 지정합니다.
dmDriverExtra 공용 구조체 멤버 다음에 있는 프라이빗 드라이버 데이터의 바이트 수를 지정합니다. 디스플레이 드라이버의 경우 일반적으로 0입니다.