Как получить текущие настройки принтера в 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;
}
|