15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


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