Может кто-то решал такую проблему : Есть 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; }
|
Как печатать выбранные страницы?
|