DocumentProperties() 함수를 사용 하 여 프린터 설정을 수정 하는 방법


요약


프린터 설정을 수정 하려면 DEVMODE 구조를 사용 하 여 방금 구조의 필드를 변경 보다 더 어렵습니다. 특히 장치에 대 한 유효한 DEVMODE 구조 DocumentProperties() 함수에 의해 수정 될 수 있는 개인 데이터를 포함 합니다.

이 문서는 DocumentProperties() 함수를 사용 하 여 DEVMODE 구조체의 내용을 수정 하는 방법에 설명 합니다.

자세한 내용


Win32 SDK에서 설명 하는 대로 DEVMODE 구조체, 공용 또는 "장치 독립 데이터" 및 전용 포함 또는 "장치 종속 데이터" DEVMODE의 전용 부분 DEVMODE 구조체의 연속 된 메모리 버퍼에 의해 정의 되는 공용 부분 바로 뒤에 있습니다.

다른 프린터 및 버전 버전 프린터 프린터 드라이버 때문에 프로그램이이 버퍼의 크기를 예측할 수 없습니다. 또한 단지 프로그램에서 선언 된 DEVMODE 구조를 개인 장치 데이터 충분 한 공간이 없습니다. 개인 데이터가 없는 DEVMODE 버퍼 CreateDC(), ResetDC()DocumentProperties()와 같은 함수에 전달 되 면 함수가 실패할 수 있습니다.

장치 드라이버를 사용 하 여 DEVMODE 안정적으로 사용 하려면 만들고이 단계를 수행 하 여 수정:

  1. 필요한 장치에서 버퍼 크기를 결정 한 후 그에 대 한 충분 한 메모리를 할당할 합니다.

    DocumentProperties() 는 마지막 매개 변수는 0으로 설정 되어 때 DEVMODE 버퍼에 대 한 필요한 바이트 수를 반환 합니다. 이 문서의 샘플 코드는이 방법의 사용 하 여 올바른 버퍼 크기를 결정 합니다. 샘플 코드 다음의 malloc () C 런타임 메모리 할당 함수를 사용 하 여 충분히 큰 버퍼를 할당 합니다. DocumentProperties()ResetDC()CreateDC() 와 같은 함수 포인터를 매개 변수로 DEVMODE 데, 때문에 대부분의 응용 프로그램 포인터로 해결 된 메모리를 할당할 수 있습니다.

    그러나 같은 공통 기능 PrintDlg() 전역 메모리 핸들이 필요한 매개 변수를 사용 합니다. 이러한 함수 중 하나에 매개 변수로 최종 DEVMODE 버퍼를 사용 하는 프로그램을 사용 는 메모리 할당를 GlobalLock()를 사용 하 여 버퍼에 대 한 포인터를 가져옵니다.
  2. 기본 설정으로 DEVMODE 버퍼 초기화 장치 드라이버를 요청 합니다.

    샘플 코드를 할당 된 버퍼로 현재 기본 설정으로 초기화 하 DocumentProperties() 를 두 번 호출 합니다. DocumentProperties() DM_OUT_BUFFER 명령이 fMode 매개 변수에 전달 되는 경우 프린터의 현재 설정으로 pDevModeOutput 매개 변수로 참조 버퍼를 채웁니다.
  3. 해당 DEVMODE 공개 부분을 변경 하 고 DocumentProperties()를 호출 하 여 해당 DEVMODE의 전용 부분에 변경 내용을 병합 하려면 장치 드라이버를 요청 합니다.

    2 단계에서 현재 설정 사용 하 여 버퍼를 초기화 한 다음 샘플 코드는 해당 DEVMODE 공개 부분을 변경 합니다. DEVMODE 구성원에 대 한 설명은 Win32 SDK 설명서를 참조 하십시오. 이 샘플 코드를 프린터 방향 및 양면 인쇄 (양면) 설정을 사용할 수 적절 하 게 변경 여부를 결정 합니다.

    참고: 플래그는 DEVMODE dmFields 구성원에서은 관련된 구조 구성원이 사용 하는 표시만 합니다. 프린터는 다양 한 서로 다른 물리적 특성 및 따라서 DEVMODE의 문서화 된 기능 집합만 지원 될 수 있습니다. 지원 되는 DEVMODE 필드 설정을 확인 하려면 응용 프로그램 DeviceCapabilities()를 사용 해야 합니다.



    예제 코드에서는 DocumentProperties() 에 대 한 세 번째 호출 그리고 DEVMODE 버퍼는 pDevModeInput 및 pDevModeOutput 매개 변수를 전달 합니다. OR("|") 연산자를 사용 하 여 fMode 매개 변수에서 DM_IN_BUFFER 및 DM_OUT_BUFFER의 결합 된 명령을 전달 합니다. 이러한 명령은 모든 설정이 입력된 버퍼에 포함 된 적용 하 고 장치에 대 한 현재 설정을 사용 하 여 병합 하는 함수를 알려 줍니다. 다음 결과 out 매개 변수에 지정 된 버퍼에 씁니다.
참고: 특정 프린터에서 프린터에 대 한 핸들 DocumentProperties() 참조: hPrinter. 이 핸들 OpenPrinter()을 보여 줍니다 코드 예제는에서 가져옵니다. OpenPrinter() 는 일반적으로 프린터의 이름을 운영 체제 셸에서 나타나는 프린터 이름이 필요 합니다. 이 이름은 EnumPrinters(), PrintDlg()반환 되 고 DEVNAMES 구조체 또는 기본 프린터에서 얻을 수 있습니다.

기본 프린터에 대 한 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조 하려면 아래 문서 번호를 클릭 합니다.

246772 검색 Windows에서 기본 프린터를 설정 하는 방법
참고:이 문서에서는 올바른 크기의 버퍼를 할당 및 초기화 하 고 해당 버퍼의 처음 두 단계 DocumentProperties()를 사용 하 여 수행 됩니다. 또한 GetPrinter()를 사용 하 여 다음이 단계를 수행할 수 있습니다. 이 예제와 자세한 내용은 Microsoft 기술 자료의 다음 문서를 참조 하려면 아래 문서 번호를 클릭:

140285 SetPrinter를 사용 하 여 프린터 설정을 수정 하는 방법

샘플 코드

샘플 코드를 구하고 DEVMODE 버퍼 변경에 대 한이 세 단계를 따릅니다. 명명 된 프린터를 사용 하 고 이러한 기능을 지원할 경우 양면 및 가로 방향으로 인쇄 하려면 DEVMODE 구성 합니다. 호출자에 게 반환 되는 결과 DEVMODE는 CreateDC(), SetPrinter(), PrintDlg()또는 ResetDC()같은 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;

}