Проблемы с печатью в Win98
От: Bailif  
Дата: 20.04.03 19:34
Оценка:
Здравствуйте!

Произвожу печать документа следующим образом:


//Получаю контекст принтера
PRINTDLG pdlg;       // Initialize the PRINTDLG structure.
memset( &pdlg, 0, sizeof( PRINTDLG ) );
pdlg.lStructSize = sizeof( PRINTDLG );
pdlg.Flags = PD_ALLPAGES           | 
         PD_DISABLEPRINTTOFILE |
         PD_NOPAGENUMS       |
         PD_NOSELECTION;

BOOL bResult = FALSE;
if (PrintDlg( &pdlg ))
 {
   DEVNAMES*    pDevNames =  (DEVNAMES*)::GlobalLock(pdlg.hDevNames);
   DEVMODE*    pDevMode  =  (DEVMODE*)::GlobalLock(pdlg.hDevMode);
   pDevMode->dmSize           = sizeof( DEVMODE);
   //Предустанавливаем ориентацию
   pDevMode->dmOrientation = DMORIENT_LANDSCAPE;
   pDevMode->dmPaperSize   = DMPAPER_A4;
   m_nPagesCount           = pdlg.nCopies;

   m_hPrintDC = CreateDC((LPCTSTR)pDevNames + pDevNames->wDriverOffset,
             (LPCTSTR)pDevNames + pDevNames->wDeviceOffset,
             (LPCTSTR)pDevNames + pDevNames->wOutputOffset,
             pDevMode);
  if (m_hPrintDC)
  {
     m_nFontSize = (pDevMode->dmPaperSize == DMPAPER_A3)?(12):(6);
    SetMapMode(pdlg.hDC, MM_TEXT);
    bResult = TRUE;
  }
}
::GlobalFree(pdlg.hDevMode);
::GlobalFree(pdlg.hDevNames);

//Далее создаём фонт
HFONT m_hFont = ::CreateFont(-MulDiv(nSize, GetDeviceCaps(m_hPrintDC, LOGPIXELSY), 72),
                               0,
                               0,
                               0,
                               400,
                               FALSE,
                               FALSE,
                               FALSE,
                               RUSSIAN_CHARSET,
                               OUT_DEFAULT_PRECIS,
                               CLIP_DEFAULT_PRECIS,
                               DEFAULT_QUALITY,
                               DEFAULT_PITCH | FF_MODERN,
                               szFontName);
if (!m_hFont)
{
    ReportErrorFromWIN32();
    return 0;
}

//Вычисляем размер области печати
m_PageRect.left = 0;
m_PageRect.top  = 0;
m_PageRect.right = ::GetDeviceCaps (m_hPrintDC, PHYSICALWIDTH) - 
                   ::GetDeviceCaps (m_hPrintDC, PHYSICALOFFSETX);
m_PageRect.bottom = ::GetDeviceCaps (m_hPrintDC, PHYSICALHEIGHT) - 
                    ::GetDeviceCaps    (m_hPrintDC, PHYSICALOFFSETY);

//Начинаем печать
DOCINFO docInfo;
memset( &docInfo, 0, sizeof(DOCINFO) );
docInfo.cbSize = sizeof(DOCINFO);
docInfo.lpszDocName = szReports[nReport];
docInfo.lpszOutput = NULL;
docInfo.lpszDatatype = NULL;
docInfo.fwType = 0;
if (!::StartDoc(m_hPrintDC, &docInfo))
{
    return ReportErrorFromWIN32();
}
    
//Новая страница
//Специально устанавливаю фонт и режим на каждой странице
//StartPage обновляет контекст в Win98

::SetMapMode(m_hPrintDC, MM_TEXT);
HFONT hOldFont = (HFONT)::SelectObject(m_hPrintDC, m_hFont);

StartPage(m_hPrintDC);
//Выводим
    ::DrawText(m_hPrintDC, 
               strPage.c_str(), 
               strPage.size(),
               &m_PageRect,
               DT_EXPANDTABS);
EndPage(m_hPrintDC);
::SelectObject(m_hPrintDC, hOldFont);


//...
//и т.д.
EndDoc(m_hPrintDC);
DeleteDC(m_hPrintDC);
DeleteObject(m_hFont);





— вот так.
— Вот это код прекрасно работает под Win2000, НО под Win98 следующая ситуация — система
начисто не использует создаваеме мной шрифты — видимо печатает шрифтом по умолчанию
— одинаковые результаты для разных размеров, типов шрифта — тоже если вообще использовать фонт по умолчанию (т.е. не устанавливать ничего) — печатает 12-м Courier и всё...
— при этом не одна функция не возвращает ошибки — по кодам ошибки всё должно работать как часы...


Самое интересное что тот же текст в "блокноте" под Win98 печатается за милую душу...- следовательно это видимо не принтер и не драйвер???
Принтер Epson LQ-100


Господа(товарищи, граждане) подскажите пожалуйста в чём может быть дело как это можно устранить или как реалтзовать другим способом (MFC не подходит — только Win API)

Спасибо!!!
Re: Проблемы с печатью в Win98
От: Рома Мик Россия http://romamik.com
Дата: 20.04.03 20:55
Оценка: 2 (1)
Здравствуйте, Bailif, Вы писали:
B>
B>StartPage(m_hPrintDC);
HFONT hOldFont = (HFONT)::SelectObject(m_hPrintDC, m_hFont);
B>//Выводим
B>    ::DrawText(m_hPrintDC, 
B>               strPage.c_str(), 
B>               strPage.size(),
B>               &m_PageRect,
B>               DT_EXPANDTABS);
::SelectObject(m_hPrintDC, hOldFont);
B>EndPage(m_hPrintDC);
B>

По идее...
<< RSDN@Home 1.0 beta 6a >>
Re[2]: Проблемы с печатью в Win98
От: Bailif  
Дата: 21.04.03 05:43
Оценка:
Здравствуйте, Рома Мик, Вы писали:

РМ>Здравствуйте, Bailif, Вы писали:

B>
B>StartPage(m_hPrintDC);
РМ>HFONT hOldFont = (HFONT)::SelectObject(m_hPrintDC, m_hFont);
B>//Выводим
B>    ::DrawText(m_hPrintDC, 
B>               strPage.c_str(), 
B>               strPage.size(),
B>               &m_PageRect,
B>               DT_EXPANDTABS);
РМ>::SelectObject(m_hPrintDC, hOldFont);
B>EndPage(m_hPrintDC);
B>

РМ>По идее...

Спасибо... Даже всё по докам... Видать временное это было временное затуманивание разума
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.