Здравствуйте!
Произвожу печать документа следующим образом:
//Получаю контекст принтера
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)
Спасибо!!!
Здравствуйте, 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 >>
Здравствуйте, Рома Мик, Вы писали:
РМ>Здравствуйте, 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>
РМ>По идее...
Спасибо...

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