To change DEVMODE settings during a print job (such as different paper bin, paper size, etc), you need to recreate the DC, passing a different DEVMODE struct. If using MFC, below is a snippet that may give you some ideas:
memcpy(pNewDevMode,pCurDevMode,pCurDevMode->dmSize+pCurDevMode->dmDriverExtra);
pNewDevMode->dmFields = pDevMode->dmFields;
pNewDevMode->dmOrientation = pDevMode->dmOrientation;
pNewDevMode->dmPaperSize = pDevMode->dmPaperSize;
pNewDevMode->dmPaperLength = pDevMode->dmPaperLength;
pNewDevMode->dmPaperWidth = pDevMode->dmPaperWidth;
pNewDevMode->dmScale = pDevMode->dmScale;
pNewDevMode->dmCopies = pInfo->m_pPD->GetCopies();
pNewDevMode->dmDefaultSource = pDevMode->dmDefaultSource;
CString cDevice = pInfo->m_pPD->GetDeviceName();
CString cDriver = pInfo->m_pPD->GetDriverName();
CString cPort = pInfo->m_pPD->GetPortName();
HDC hDC = ::CreateDC((LPCSTR)((const char *)cDriver),
(LPCSTR)((const char *)cDevice),
(LPCSTR)((const char *)cPort),
<big>pNewDevMode</big>);
if (hDC)
{
pDC->EndDoc();
HDC hOldDC = pDC->Detach();
if (hOldDC)
::DeleteDC(hOldDC);
pDC->Attach(hDC);
pDC->SetAbortProc(PrintAbortProc);
DOCINFO docInfo;
ZeroMemory(&docInfo, sizeof(DOCINFO));
docInfo.cbSize = sizeof(DOCINFO);
char caName[31];
strcpy(caName,((const char *)pDoc->GetTitle().Left(30)));
docInfo.lpszDocName = (LPCSTR)caName;
docInfo.lpszOutput = NULL;
if (pDC->StartDoc(&docInfo) == SP_ERROR)