DocumentProperties() 함수를 사용하여 프린터 설정 수정
이 문서에서는 함수를 사용하여 프린터 설정을 수정하는 방법을 보여 줍니다 DocumentProperties()
.
원래 제품 버전: 프린터
원본 KB 번호: 167345
요약
DEVMODE 구조를 사용하여 프린터 설정을 수정하는 것은 구조체의 필드를 변경하는 것보다 더 어렵습니다. 특히 디바이스에 대한 유효한 DEVMODE 구조에는 함수에서만 수정 DocumentProperties()
할 수 있는 프라이빗 데이터가 포함됩니다.
이 문서에서는 함수를 사용하여 DEVMODE 구조체의 내용을 수정하는 DocumentProperties()
방법을 설명합니다.
추가 정보
Win32 SDK에 설명된 DEVMODE 구조체에는 퍼블릭 또는 '디바이스 독립적 데이터' 및 프라이빗 또는 '디바이스 종속 데이터'가 포함됩니다. DEVMODE의 프라이빗 부분은 DEVMODE 구조에 의해 정의된 공용 파트 바로 다음에 인접한 메모리 버퍼에 존재합니다.
프로그램은 프린터와 프린터, 버전과 프린터 드라이버 버전이 다르기 때문에 이 버퍼의 크기를 예측할 수 없습니다. 또한 프로그램에서 선언한 DEVMODE 구조체에는 개인 디바이스 데이터에 대한 충분한 공간이 없습니다. 프라이빗 데이터가 없는 DEVMODE 버퍼가 , ResetDC()
및 와 DocumentProperties()
같은 CreateDC()
함수에 전달되면 함수가 실패할 수 있습니다.
디바이스 드라이버에서 DEVMODE를 안정적으로 사용하려면 다음 단계에 따라 만들고 수정합니다.
디바이스에서 필요한 버퍼 크기를 확인한 다음 충분한 메모리를 할당합니다.
DocumentProperties()
는 마지막 매개 변수가 0으로 설정된 경우 DEVMODE 버퍼에 필요한 바이트 수를 반환합니다. 이 문서의 샘플 코드는 이 기술을 사용하여 버퍼의 올바른 크기를 결정합니다. 그런 다음 샘플 코드는 의malloc()
C 런타임 메모리 할당 함수를 사용하여 충분히 큰 버퍼를 할당합니다.DocumentProperties()
및 함수는 DEVMODE에 대한 포인터를 매개 변수로 사용ResetDC()
하므로CreateDC()
대부분의 애플리케이션은 포인터로 처리되는 메모리를 할당할 수 있습니다.그러나 일반적인
PrintDlg()
함수와 같은 함수는 전역 메모리에 대한 핸들이어야 하는 매개 변수를 사용합니다. 프로그램에서 이러한 함수 중 하나에 대한 매개 변수로 최종 DEVMODE 버퍼를 사용하는 경우 를 사용하여GlobalAlloc()
메모리를 할당하고 를 사용하여GlobalLock()
버퍼에 대한 포인터를 가져와야 합니다.디바이스 드라이버에 기본 설정을 사용하여 DEVMODE 버퍼를 초기화하도록 요청합니다.
샘플 코드는 두 번째로 를 호출
DocumentProperties()
하여 현재 기본 설정을 사용하여 할당된 버퍼를 초기화합니다.DocumentProperties()
명령이 fMode 매개 변수에 전달될 때DM_OUT_BUFFER
pDevModeOutput 매개 변수라고 하는 버퍼를 프린터의 현재 설정으로 채웁니다.DEVMODE의 공용 부분을 변경하고 를 호출
DocumentProperties()
하여 디바이스 드라이버에 변경 내용을 DEVMODE의 프라이빗 부분에 병합하도록 요청합니다.2단계에서 현재 설정을 사용하여 버퍼를 초기화한 후 샘플 코드는 DEVMODE의 공용 부분을 변경합니다. DEVMODE 멤버에 대한 설명은 Win32 SDK 설명서를 참조하세요. 이 샘플 코드는 프린터에서 방향 및 이중(양면) 설정을 사용할 수 있는지 여부를 결정하고 적절하게 변경합니다.
참고
DEVMODE의 dmFields 멤버에 있는 플래그는 프린터가 연결된 구조체 멤버를 사용한다는 표시일 뿐입니다. 프린터는 다양한 물리적 특성을 가지므로 DEVMODE의 문서화된 기능의 하위 집합만 지원할 수 있습니다. DEVMODE 필드의 지원되는 설정을 확인하려면 애플리케이션에서 를 사용해야
DeviceCapabilities()
합니다.그런 다음 샘플 코드는 세 번째 호출을 수행하고
DocumentProperties()
pDevModeInput 및 pDevModeOutput 매개 변수 모두에서 DEVMODE 버퍼를 전달합니다. 또한 OR("|") 연산자를 사용하여 fMode 매개 변수에서 DM_IN_BUFFER 및 DM_OUT_BUFFER 결합된 명령을 전달합니다. 이러한 명령은 입력 버퍼에 포함된 모든 설정을 사용하고 디바이스의 현재 설정과 병합하도록 함수에 지시합니다. 그런 다음 out 매개 변수에 지정된 버퍼에 결과를 씁니다.
참고
DocumentProperties()
는 프린터 핸들로 특정 프린터를 참조합니다. hPrinter입니다. 이 핸들은 샘플 코드에서도 보여 주는 에서 OpenPrinter()
가져옵니다. OpenPrinter()
에는 일반적으로 운영 체제 셸에 표시되는 프린터의 이름인 프린터 이름이 필요합니다. 이 이름은 에서 EnumPrinters()
반환 PrintDlg()
된 DEVNAMES 구조체 또는 기본 프린터에서 가져올 수 있습니다.
이 문서에서는 버퍼의 올바른 크기를 할당하고 해당 버퍼를 초기화하는 처음 두 단계는 를 사용하여 DocumentProperties()
수행됩니다. 를 사용하여 GetPrinter()
다음 단계를 수행할 수도 있습니다.
자세한 내용과 예제는 SetPrinter 함수를 사용하여 프린터 설정 수정을 참조하세요.
샘플 코드
샘플 코드는 DEVMODE 버퍼를 가져오고 변경하기 위한 다음 세 단계를 수행합니다. 함수는 명명된 프린터를 사용하고 이러한 기능을 지원하는 경우 양면 및 가로 방향으로 인쇄하도록 DEVMODE를 구성합니다. 호출자에게 반환되는 결과 DEVMODE는 , , SetPrinter()
PrintDlg()
또는 ResetDC()
와 같은 CreateDC()
DEVMODE 버퍼를 사용하는 다른 API 호출에 적합합니다. DEVMODE 버퍼를 사용하여 호출자가 완료되면 호출자는 메모리를 해제해야 합니다.
LPDEVMODE GetLandscapeDevMode(HWND hWnd, char *pDevice)
{
HANDLE hPrinter;
LPDEVMODE pDevMode;
DWORD dwNeeded, dwRet;
/* Start by opening the printer */
if (!OpenPrinter(pDevice, &hPrinter, NULL))
return NULL;
/*
* Step 1:
* Allocate a buffer of the correct size.
*/
dwNeeded = DocumentProperties(hWnd,
hPrinter, /* Handle to our printer. */
pDevice, /* Name of the printer. */
NULL, /* Asking for size, so */
NULL, /* these are not used. */
0); /* Zero returns buffer size. */
pDevMode = (LPDEVMODE)malloc(dwNeeded);
/*
* Step 2:
* Get the default DevMode for the printer and
* modify it for your needs.
*/
dwRet = DocumentProperties(hWnd,
hPrinter,
pDevice,
pDevMode, /* The address of the buffer to fill. */
NULL, /* Not using the input buffer. */
DM_OUT_BUFFER); /* Have the output buffer filled. */
if (dwRet != IDOK)
{
/* If failure, cleanup and return failure. */
free(pDevMode);
ClosePrinter(hPrinter);
return NULL;
}
/*
* Make changes to the DevMode which are supported.
*/
if (pDevMode->dmFields & DM_ORIENTATION)
{
/* If the printer supports paper orientation, set it.*/
pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
}
if (pDevMode->dmFields & DM_DUPLEX)
{
/* If it supports duplex printing, use it. */
pDevMode->dmDuplex = DMDUP_HORIZONTAL;
}
/*
* Step 3:
* Merge the new settings with the old.
* This gives the driver an opportunity to update any private
* portions of the DevMode structure.
*/
dwRet = DocumentProperties(hWnd,
hPrinter,
pDevice,
pDevMode, /* Reuse our buffer for output. */
pDevMode, /* Pass the driver our changes. */
DM_IN_BUFFER | /* Commands to Merge our changes and */
DM_OUT_BUFFER); /* write the result. */
/* Finished with the printer */
ClosePrinter(hPrinter);
if (dwRet != IDOK)
{
/* If failure, cleanup and return failure. */
free(pDevMode);
return NULL;
}
/* Return the modified DevMode structure. */
return pDevMode;
}
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기