Cum să modificați setările imprimantei cu funcția DocumentProperties()


Rezumat


Folosind o structură de mod dezvoltare să modificați setările imprimantei este mai dificil decât doar schimbarea câmpurile structura. Mai precis, o structură de mod dezvoltare validă pentru un dispozitiv conține date private, care poate fi modificat numai prin funcția DocumentProperties() .

Acest articol explică cum se modifică conținutul o structură de mod dezvoltare cu funcția DocumentProperties() .

Mai multe informații


O structură de mod dezvoltare , ca documentate de Win32 SDK, conține publice sau "device independente date" şi private sau "device date dependente." Partea privată de un mod de dezvoltare există imediat după partea publice, care este definit de structura mod dezvoltare , într-un tampon contiguă de memorie.

Un program nu poate prezice dimensiunea acest tampon, deoarece este diferit de imprimantă pentru imprimantă și de la versiunea pentru versiunea de driver de imprimantă. În plus, o structură de mod dezvoltare care este declarat doar de un program nu conține suficient spațiu pentru date private dispozitiv. Dacă un tampon mod dezvoltare care lipsesc date private este transmis de funcții, cum ar fi CreateDC(), ResetDC()și DocumentProperties(), funcția poate să nu reușească.

Pentru a utiliza constituie un mod de dezvoltare cu un driver de dispozitiv, crea și modifica urmând acești pași:

  1. Determina dimensiunea necesară tampon din dispozitivul și apoi alocat memorie suficientă pentru acesta.

    DocumentProperties() returnează numărul de octeţi care sunt necesare pentru ca un tampon mod dezvoltare când ultimul parametru este setat la 0. Exemplu de cod din acest articol utilizează această tehnică pentru a determina dimensiunea corectă a tampon. Exemplu de cod apoi folosește funcția C run-time memorie alocare de malloc() să aloce un tampon care este suficient de mare. Deoarece DocumentProperties() și funcții precum ResetDC() și CreateDC() ia indicatori la un mod de dezvoltare ca un parametru, cele mai multe aplicaţii pot fi alocate de memorie care este tratată de către un indicator.

    Cu toate acestea, funcții, cum ar fi comune PrintDlg() ia parametrii care sunt necesare pentru a fi handle-uri în memoria global. Dacă un program utilizează finale tampon mod dezvoltare ca un parametru de la unul dintre aceste funcții, ar trebui să aloce memorie folosind GlobalAlloc() şi obține un indicator spre tampon folosind GlobalLock().
  2. Puneți driverul de dispozitiv a reușit inițializarea mod dezvoltare tamponul cu setările implicite.

    Exemplu de cod apelează DocumentProperties() a doua oară a reușit inițializarea alocat tampon cu setările implicite curentă. DocumentProperties() umple tamponul denumite parametrul pDevModeOutput cu setările curente imprimantei atunci când comanda DM_OUT_BUFFER este introdus în parametrul fMode.
  3. Modificări la partea publică a mod de dezvoltare și cereți driverul de dispozitiv pentru a îmbina modificările efectuate în partea privată de mod de dezvoltare apelând DocumentProperties().

    După inițializarea tampon cu setările curente în pasul 2, mostre de cod efectuează modificări partea publice de mod de dezvoltare. Consultați documentația Win32 SDK pentru descrieri mod dezvoltare membri. Acest exemplu de cod determină dacă imprimanta poate utiliza orientare și setările duplex (dublu față) și ele se modifică în mod corespunzător.

    Notă: un semnalizator într-un mod de dezvoltare dmFields membru este doar un indiciu că o imprimantă utilizează membru structura asociate. Imprimante au o varietate de alte caracteristici și, prin urmare, numai poate accepta un subset de capacitățile documentate un mod de dezvoltare. Pentru a stabili setările acceptate de un mod de dezvoltare câmp, aplicațiile trebuie să utilizeze DeviceCapabilities().



    Exemplu de cod apoi face un al treilea apel la DocumentProperties() şi trece tampon mod dezvoltare în parametrii atât pDevModeInput și pDevModeOutput. De asemenea, trece combinată comenzile de DM_IN_BUFFER și DM_OUT_BUFFER în parametrul fMode utilizând operatorul OR("|"). Aceste comenzi spuneți funcția să ia orice setări sunt conținute în tampon de intrare și să le îmbine cu setările curente pentru dispozitiv. Apoi se scrie rezultatul tampon specificat în parametrul afară.
Notă: DocumentProperties() se referă la o anumită imprimantă cu un identificator de la o imprimantă: hPrinter. Acest identificator este obținut de la OpenPrinter(), care mostre de cod, de asemenea, ilustrează. OpenPrinter() necesită numele unei imprimante, care este, de obicei, numele prietenos al imprimantei, așa cum apare în sistemul de operare shell. Acest nume poate fi obținut din EnumPrinters(), din structura DEVNAMES returnat de PrintDlg()sau la imprimanta implicită.

Pentru informații suplimentare despre imprimanta implicită, faceți clic pe următorul număr de articol pentru a vedea articolul în baza de cunoștințe Microsoft:

Cum 246772 pentru a regăsi și setați imprimanta implicită în Windows
Notă: în acest articol, mai întâi doi pași de alocare dimensiunea corectă a tampon și inițializarea tampon care se efectuează cu DocumentProperties(). Urmaţi aceşti paşi utilizând GetPrinter(). Pentru informații suplimentare și un exemplu de acest lucru, faceți clic pe următorul număr de articol pentru a vedea articolul în baza de cunoștințe Microsoft:

140285 cum să modificați setările imprimantei, utilizând SetPrinter

Exemplu de cod

Exemplu de cod urmează aceste trei pași pentru obținerea și modificarea tampon mod dezvoltare. Funcția durează o imprimantă denumit și se configurează un mod de dezvoltare pentru a imprima dublu și în vedere orientarea dacă acesta acceptă aceste caracteristici. Mod de dezvoltare rezultate care se returnează apelantului este potrivit pentru alte apeluri API care utilizează buffers mod dezvoltare, cum ar fi CreateDC(), SetPrinter(), PrintDlg()sau ResetDC(). Când apelantului s-a terminat folosind tampon mod dezvoltare, apelantului este responsabilă pentru eliberarea memoriei.

   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;

}