Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Печать "большого" документа, Печать "большого" документа 
:(
    Опции темы
olegkuzn
Дата 11.1.2008, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 1.10.2007

Репутация: нет
Всего: нет



Может кто-то решал такую проблему :
Есть CMyView производный от CScrollView
Есть метод CMyView::OnDraw(CDC* pDC ) который формирует рисунок (диаграму)   максимальным размером 1000мм на 1000мм (В режиме LOMETRIC 10000 на 10000 );
Необходимо напечатать выбранные страницы этой диаграммы 
Печать происходит в режиме "что на экране то и на печати" 
(т.е. для печати вызывается тоже ф-ция CMyView::OnDraw(CDC* pDC ))

Код

// файл PageQueue.h
#include <afxtempl.h>
#ifndef PAGE_QUEUE
#define PAGE_QUEUE

//    структура содержит характеристики страницы для печати
struct Page
{
protected:
    UINT m_nRow;    // номер строки
    UINT m_nCol;    // номер колонки

    // размер страницы в миллиметрах зависит от 
    // настроек принтера, размера и ориентации листа
    static CSize m_szPage; 

public:
    // конструкторы
    Page(UINT nRow = 0, UINT nCol = 0):
        m_nRow( nRow ),
        m_nCol( nCol ) {}

    Page( const Page& page ):
        m_nRow(page.m_nRow),
        m_nCol(page.m_nCol) {}

    Page( const CPoint& ptMMCoord ):
        m_nRow((int)(ptMMCoord.y / m_szPage.cy)),
        m_nCol((int)(ptMMCoord.x / m_szPage.cx)) 
        {}


    // оператор присваивания
    Page& operator = ( const Page& page )
    {
        m_nRow = page.m_nRow;
        m_nCol = page.m_nCol;
        return *this;
    }

    // получение прямоугольников в миллиметрах
    CRect GetMMRect(double dScale = 1.0/*масштаб*/) const;
    // получение прямоугольника для режима MM_LOMETRIC
    CRect GetLoMetricRect(double dScale = 1.0/*масштаб*/) const;

    // ф-ция сравнения страниц для печати какая первая
    friend int Compare( const Page& page1,  const Page& page2 );

    // дружественный класс массив страниц
    friend class PageQueue;
};

// массив (очередь) выбранных страниц для печати
class PageQueue
{
protected:
    // массив страниц 
    CArray<Page,Page> pageArray;
    
public:

    // конструктор
    PageQueue(){}

    // кол-во страниц в массиве
    int SizeQueue( void ) {return (int)pageArray.GetSize();}

    // получение страницы по номеру
    Page GetAt(int ind) {return pageArray[ind];} 
    Page operator [] (int ind) {return pageArray[ind];} 

    // добавить страницу
    INT_PTR AddPage( const Page& page );
    // удалить страницу
    void    DelPage( INT_PTR nInd );
    // удаление всех страниц
    void    DelAllPages( void ) { pageArray.RemoveAll(); }
    // поиск эквивалентнмой страницы в массиве
    INT_PTR FindPage( const Page& page ); 

    // установление размера страницы
    void SetPageSize( UINT nXPageSize, UINT nYPageSize )
    {
        Page::m_szPage.SetSize(nXPageSize,nYPageSize);
        pageArray.RemoveAll();
    }

};
#endif // PAGE_QUEUE
// конец файла PageQueue.h
//-----------------------------------------------------------------------


//-----------------------------------------------------------------------
// фрагменты файла CMyView.cpp

//
//    ф-ция отклик на команду ON_FILE_PRINT 
//
void CMyView::OnFilePrint( void )
{
         // PageQueue* m_pPageQueue - член класса CMyView 
    if( m_pPageQueue == NULL )
        m_pPageQueue =  new PageQueue;

    CScrollView::OnFilePrint();

    if( m_pPageQueue != NULL )
    {
        m_pPageQueue->DelAllPages();
        delete m_pPageQueue;
        m_pPageQueue = NULL;

    }
}

//
//   ф-ция подготовки печати 
//

BOOL CSCHimetricView::OnPreparePrinting(CPrintInfo* pInfo)
{
    pInfo->m_bDirect  = true;
    pInfo->m_bPreview = false;
         // сюда помещается указатель на массив страниц
    pInfo->m_lpUserData = (LPVOID)m_pPageQueue;

    if(!DoPreparePrinting( pInfo ))
        return FALSE;

         // Диалог CMyPrintDialog - определяет выбор и настройки принтера,
         // а также "заполняет" массив выбранных для печати страниц 
    CMyPrintDialog printDialog( this, pInfo );
    if( printDialog.DoModal() != IDOK )
        return FALSE;
 
    return TRUE;
}



Как печатать выбранные страницы?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1339 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.