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