CreateSaveDC VC++ Example

void CEPrintDemoView::PlayGDICommands(HDC hdc) 
{

   HPEN hPen; 
   HBRUSH hBrush,hFillBrush; 
   RECT rt,rcFillRect; 
   GetClientRect(&rt); 

   hPen = CreatePen(PS_DASHDOT,1, RGB(0,0,255)); 
   hBrush = CreateHatchBrush(HS_CROSS, RGB(0,0,0)); 
   hFillBrush = CreateSolidBrush(RGB(255,255,255)); 
   SaveDC(hdc); 
   SelectObject(hdc, hBrush); 
   SelectObject(hdc, hPen); 

   rcFillRect.top= 0; 
   rcFillRect.left = 0; 
   rcFillRect.right = GetDeviceCaps(hdc, HORZRES); 
   rcFillRect.bottom = GetDeviceCaps(hdc, VERTRES); 

// Do some GDI commands. 
   FillRect(hdc,&rcFillRect,hFillBrush); 
   Rectangle(hdc,0,0,100,100); 
   
   DeleteObject(hFillBrush); 
   RestoreDC(hdc,-1); 
   DeleteObject(hPen); 
   DeleteObject(hBrush); 
}

void CEPrintDemoView::OnCreateSaveDC()
{
   IEpnMultiSaveOptions * pMultiSaveOptions; 
   IEpnExtraDcOptions * pExtraDcOptions; 
   IEPrint * pLeadPrnt; 
   HRESULT hr; 

   long hDC = NULL; 

   hr = ::CoCreateInstance(CLSID_EPrint, NULL, CLSCTX_ALL, IID_IEPrint, (void**) &pLeadPrnt); 
   if(FAILED(hr)) 
      return; 

   hr = ::CoCreateInstance(CLSID_EpnMultiSaveOptions, NULL, CLSCTX_ALL, IID_IEpnMultiSaveOptions, (void**) &pMultiSaveOptions); 
   if(FAILED(hr)) 
      return; 

   hr = ::CoCreateInstance(CLSID_EpnExtraDcOptions, NULL, CLSCTX_ALL, IID_IEpnExtraDcOptions, (void**) &pExtraDcOptions); 
   if(FAILED(hr)) 
      return; 

   if (pLeadPrnt-> IsSupportLocked (SUPPORT_OEM)) 
      pLeadPrnt->UnlockSupport (SUPPORT_OEM, OEM_KEY); 

   pLeadPrnt->GetPrinterSaveOptions (TEST_PRINTER_NAME, &pMultiSaveOptions); 
   
   pExtraDcOptions->Password = "Test Password";
   
   hDC = pLeadPrnt->CreateSaveDC (TEST_PRINTER_NAME, NULL, pMultiSaveOptions->GetPrinterSaveOptions(0), pExtraDcOptions); 
   if(hDC) 
   {
      short nRet; 
      _bstr_t bstr(" file test ");

      nRet = pLeadPrnt->StartDoc (hDC, bstr); 
      if(nRet == 0) 
      {
         nRet = pLeadPrnt->StartPage (hDC); 
         if(nRet == 0) 
         {
            PlayGDICommands((HDC)hDC); 
            nRet = pLeadPrnt->EndPage (hDC); 
         }
         nRet = pLeadPrnt->EndDoc (hDC); 
      }
      pLeadPrnt->DeleteDC ((long)hDC); 
   }

   if(pExtraDcOptions) 
   {
      pExtraDcOptions->Release();
      pExtraDcOptions = NULL; 
   }

   if(pMultiSaveOptions) 
   {
      pMultiSaveOptions->Release();
      pMultiSaveOptions = NULL; 
   }

   if(pLeadPrnt) 
   {
      pLeadPrnt->Release();
      pLeadPrnt = NULL; 
   }