Re: Как определить длину документа при печати?
От: ryazantsev_iv  
Дата: 15.09.05 13:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть 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);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.