Как получить текущие настройки принтера в MFC

Единственный способ, получить доступ к текущим настройкам принтеров, это через структуры m_hDevMode и m_hDevNames хранящимися в CWinApp. Эти члены доступны через структуру PRINTDLG, указатель которой передаётся в функцию-член GetPrinterDeviceDefaults() класса, наследованного от CWinApp. Так как возвращаемые значения hDevMode и hDevNames являются переменными HGLOBAL, то для того, чтобы вернуть указатель на структуры необходимо вызывать ::GlobalLock(). Используя данный указатель, можно извлечь информацию из структуры, чтобы определить текущее состояние принтера. Более подробно о содержимом этих структур можно посмотреть DEVMODE и DEVNAMES в хелпе по SDK.

Нижеприведённый пример является функцией-членом класса, наследованного от CView, которая возвращает текущий размер страницы принтера используя GetDeviceCaps() на объекте CDC, созданного с установками принтера:

Пример кода

 /* Необходимые опции компилятора: нет
*/

BOOL CMyView::GetPageSize(CSize &nRetVal)
{
PRINTDLG FAR * pPrintDlg = new PRINTDLG;
BOOL bRet = FALSE;

// Получаем текущие установки принтера.

if(AfxGetApp()->GetPrinterDeviceDefaults(pPrintDlg))
{

// Получаем указатели на две структуры с установками.

DEVNAMES FAR *lpDevNames =
(DEVNAMES FAR *)::GlobalLock(pPrintDlg->hDevNames);

DEVMODE FAR *lpDevMode =
(DEVMODE FAR *)::GlobalLock(pPrintDlg->hDevMode);

// Получаем информацию о драйвере.

CString szDriver((LPTSTR)lpDevNames +
lpDevNames->wDriverOffset);
CString szDevice((LPTSTR)lpDevNames +
lpDevNames->wDeviceOffset);
CString szOutput((LPTSTR)lpDevNames +
lpDevNames->wOutputOffset);

// Создаём объект CDC согласно текущим настройкам.

CDC pDC;
pDC.CreateDC(szDriver, szDevice, szOutput, lpDevMode);

// Запрашиваем у объекта CDC ширину и высоту текущей страницы.

nRetVal.cx = pDC.GetDeviceCaps(HORZSIZE);
nRetVal.cy = pDC.GetDeviceCaps(VERTSIZE);

// Избавляемся от объекта CDC.

pDC.DeleteDC();

// Разблокируем указатели на структуры настроек.

::GlobalUnlock(pPrintDlg->hDevNames);
::GlobalUnlock(pPrintDlg->hDevMode);

bRet = TRUE;
}
delete pPrintDlg;
return bRet;
}

 

 
« Предыдущая статья   Следующая статья »