Здравствуйте, Аноним, Вы писали:
А>Есть mfc SDI приложение на основе CRichEditView. Полностью сгенерированное визардом. Открываю в нем текстовый файл. Жму печать. Вся печать сделана по-умолчанию. Диапазон печатаемых страниц определен как 1-65535. Некоторые принтеры догадываются прекратить печать на фактической последней странице, а некоторые хотят напечатать все 65К страниц. Нехорошо....
А>Вопрос: как же определить количество страниц в документе?
А>И что меня больше всего забавляет. В версии Debug диалог предваряющий печать выглядит одним образом (в стиле Win2000), имеет вкладки. В релиз версии он выглядит абсолютно не так (в стиле Win98), то есть сама форма другая! Это почему?
Я сделал следующим образом. Если внимательно посмотреть, как реализована функция
CRichEditView::OnPrint(pDC, pInfo)в MFC, то там, если pInfo->SetMaxPage(nPage) не определена и последний индекс выведенного на печать символа больше или равен длине текста в CRichEditView то вызывается SetMaxPage(nPage). Скопируем весь код этой реализации в наш OnPreparePrinting(CPrintInfo* pInfo), при этом первоначально инициализируем массив открытых страниц m_aPageStart.Add(1) (в конце очистим m_aPageStart.RemoveAll()) . А вместо pInfo->m_nCurPage подставим первую страницу.
BOOL CReportView::OnPreparePrinting(CPrintInfo* pInfo)
{
CDC *pDC;
pDC = this->GetDC();
UINT m_CurPage = 1; // вместо pInfo->m_nCurPage;
m_aPageStart.Add(1);
while(TRUE)
{
UINT nPage = m_CurPage;
ASSERT(nPage <= (UINT)m_aPageStart.GetSize());
long nIndex = (long) m_aPageStart[nPage-1];
nIndex = PrintPage(pDC, nIndex, 0xFFFFFFFF);
if (nIndex >= GetTextLengthEx(GTL_PRECISE | GTL_NUMCHARS))
{
//TRACE(traceAppMsg, 0, "End of Document\n");
pInfo->SetMaxPage(nPage);
break; // количество страниц определно, выходим из цикла
}
if (nPage == (UINT)m_aPageStart.GetSize())
{
if (nIndex < GetTextLengthEx(GTL_PRECISE | GTL_NUMCHARS))
m_aPageStart.Add(nIndex);
}
else
{
ASSERT(nPage+1 <= (UINT)m_aPageStart.GetSize());
ASSERT(nIndex == (long)m_aPageStart[nPage+1-1]);
}
m_CurPage++;
}
// Освобождаем массив
m_aPageStart.RemoveAll();
return DoPreparePrinting(pInfo);
}