Creating a Printer Device Context
An application can create a printer DC in several different ways:
By calling the PrintDlg function to display a common dialog box that allows the user to specify printer options, then creating a printer DC by using those options.
By creating a printer DC by using the default printer data from the GetDefaultPrinter and GetPrinter functions.
By creating a printer DC by using the default printer data from the Win.ini file.
Note This way is no longer recommended.
This section contains code demonstrating the second method.
TCHAR szDriver[16] = _T("WINSPOOL");
TCHAR szPrinter[256];
DWORD cchBuffer = 255;
HDC hdcPrint = NULL;
HANDLE hPrinter = NULL;
PRINTER_INFO_2 *pPrinterData;
BYTE pdBuffer[16384];
BOOL bReturn = FALSE;
DWORD cbBuf = sizeof (pdBuffer);
DWORD cbNeeded = 0;
pPrinterData = (PRINTER_INFO_2 *)&pdBuffer[0];
// get the default printer name
bReturn = GetDefaultPrinter(
szPrinter,
&cchBuffer);
if (bReturn) {
// open the default printer
bReturn = OpenPrinter(
szPrinter,
&hPrinter,
NULL);
}
if (bReturn) {
// get the printer port name
bReturn = GetPrinter(
hPrinter,
2,
&pdBuffer[0],
cbBuf,
&cbNeeded);
// this handle is no longer needed
ClosePrinter(hPrinter);
}
if (bReturn) {
// create the Print DC
hdcPrint = CreateDC(szDriver, szPrinter,
pPrinterData->pPortName, NULL);
}
if (hdcPrint) {
// Print a test page that contains the string
// "PRINTER TEST" in the upper left corner.
Escape(hdcPrint, STARTDOC, 8, "Test-Doc", NULL);
TextOut(hdcPrint, 50, 50, _T("PRINTER TEST"), 12);
Escape(hdcPrint, NEWFRAME, 0, NULL, NULL);
Escape(hdcPrint, ENDDOC, 0, NULL, NULL);
// Delete the printer DC.
DeleteDC(hdcPrint);
}
This section contains code demonstrating the last method.
To use the default printer, retrieve and parse the appropriate string from the Win.ini file. This string is retrieved by calling the GetProfileString function and specifying the appropriate section and entry names. In the case of the default printer, this data is stored in the [windows] section and identified by the entry named device. The seventh line in the following excerpt from a Win.ini file shows an entry for a Kodak Diconix printer.
[windows]
load=
run=
Beep=yes
Spooler=yes
NullPort=None
device=Diconix,winspool,LPT1:
CoolSwitch=1
BorderWidth=3
KeyboardSpeed=31
InitialKeyboardIndicators=2
CursorBlinkRate=530
DoubleClickSpeed=686
Programs=com exe bat pif cmd
Documents=
DeviceNotSelectedTimeout=15
TransmissionRetryTimeout=45
swapdisk=
NetWarn=1
fPromptOnVerbose=FALSE
fPromptOnWarning=FALSE
fPromptOnError=TRUE
fPrintVerbose=FALSE
fPrintFileLine=FALSE
shell=
ScreenSaveTimeOut=300
ScreenSaveActive=0
DebugOptions=2048
The following example shows how a printer DC was created by using the data from Win.ini.
HDC hdcPrint; // printer DC handle
TCHAR szDevString[120]; // array for WIN.INI data
TCHAR *szPrinter, *szDriver; // printer and driver names
TCHAR *szPort; // port name
TCHAR *nextChar;
// Retrieve the printer, printer driver, and
// output-port names from WIN.INI.
GetProfileString(_T("windows"), _T("device"), _T(",,,"),
szDevString, 120);
// Parse the string of names, setting ptrs as required
// If the string contains the required names, use them to
// create a device context.
if ((szPrinter = _tcstok_s(szDevString,
_T(","), &nextChar))
&& (szDriver = _tcstok_s (NULL,
_T(", "), &nextChar))
&& (szPort = _tcstok_s (NULL,
_T(", "), &nextChar)))
{
hdcPrint = CreateDC(szDriver, szPrinter,
szPort, NULL);
}
// Print a test page that contains the string
// "PRINTER TEST" in the upper left corner.
Escape(hdcPrint, STARTDOC, 8, "Test-Doc", NULL);
TextOut(hdcPrint, 50, 50, _T("PRINTER TEST"), 12);
Escape(hdcPrint, NEWFRAME, 0, NULL, NULL);
Escape(hdcPrint, ENDDOC, 0, NULL, NULL);
// Delete the printer DC.
DeleteDC(hdcPrint);
Send comments about this topic to Microsoft
Build date: 9/7/2011