Приветствую Вас на своем сайте!
Главная Форум Полезные файлы Музыка Cофт Профиль Фото галерея Выход Вход
  Менюшка

  Мини-чат

  Cыграйка

  Бонус wmr


Получите WMR-бонус
от 0,01 до 0,20 WMR на свой кошелек!

  Проголосуй

Скоко вы в интернете?
Всего ответов: 26

Главная » 2008 » Сентябрь » 21 » Печать и предварительный просмотр документов(2)
Печать и предварительный просмотр документов(2)
10:00:48

Именно из него осуществляются вызовы всех рассмотренных функций, и в
большинстве случаев вполне достаточно переопределить только те из них, которые
необходимы для индивидуальной организации печати документа.


Второй момент, на который следует обратить внимание, связан с принудительным
завершением вывода данных на принтер, т. е. с функциями
size=2>AbortDoc
и SetAbortProc из
Win32 API. Как уже отмечалось, нужно установить при помощи функции
face="Courier New" size=2>SetAbortProc
специальную функцию, которая и
будет отслеживать требование на завершение печати, периодически вызывая функцию
CDC::QueryAbort, сообщающую, можно ли
продолжать процесс печати или его нужно срочно завершить.


Всех этих сложностей можно избежать, если оставить функцию
face="Courier New" size=2>CView
::
size=2>OnFilePrint
в покое. Пусть она делает свое дело, тем более, что у
нее это получается хорошо.


Остановившись на последнем варианте (не переопределяя функцию
face="Courier New" size=2>OnFilePrint
), продолжим рассмотрение процесса
печати и того, как он реализован в библиотеке MFC.


Начиная по командам ID_FILE_PRINT или
ID_FILE_PRINT_DIRECT прогресс печати,
библиотека MFC вызывает функцию
size=2>OnPreparePrinting
нашего объекта "представление", передавая ей в
качестве параметра указатель на уже подготовленную структуру
face="Courier New" size=2>CPrintlnfo
. Поскольку в этот момент приложению
неизвестно количество страниц печатаемого документа, то значения первой и
последней печатаемой страницы устанавливаются, соответственно, в 1 и -1 (
face="Courier New" size=2>OxFFFF
). Здесь удобнее всего определить длину
документа (число его страниц), вызвав функцию
size=2>SetMaxPage
структуры
size=2>CPrintlnfo
. Второй задачей функции
size=2>OnPrepare Printing
является вызов
size=2>Do Prepare Printing,
которая выводит на экран блок диалога
face="Courier New" size=2>Print
и создает контекст устройства для
принтера. Если по каким-либо причинам вас не устраивает внешний вид блока
диалога или начальные установки принтера, то перед вызовом этой функции их можно
изменить. Те параметры, которые пользователь установил в блоке диалога, доступны
через поля структуры CPrintlnfo. Так,
например, если пользователь задал номера страниц, которые требуется напечатать,
то их можно получить при помощи функций
size=2>GetFromPage
и GetToPage.
Лаконичность последней фразы не должна создавать иллюзию, что все так уж просто.
Для того чтобы воспользоваться функциями
size=2>GetFromPage
и" GetToPage,
сначала необходимо проверить состояние группы переключателей
face="Courier New" size=2>Pagerange
(Диапазон печати). Функции вернут
достоверные значения только в том случае, если установлен переключатель
face="Courier New" size=2>Pages
(Страницы).


 Примечание 


Следует иметь в виду, что при выполнении команды
face="Courier New" size=2>ID_FILE_PRINT_DIRECT
блок диалога не выводится,
а непосредственно начинается процесс печати документа.


Следующей функцией, вызываемой библиотекой MFC, является функция
face="Courier New" size=2>OnBeginPrinting
. Ее наличие в цикле печати
свидетельствует о похвальном желании разработчиков библиотеки предоставить
программистам возможность именно здесь определиться и получить от системы все
необходимые ресурсы GDI. Правда, на практике мало кто использует эту возможность
— обычно ресурсы запрашиваются у системы непосредственно в функциях
face="Courier New" size=2>OnDraw
или OnPrint и там же, кстати говоря, и
возвращаются ей обратно.


После того как функция CDC::StartDoc
сформирует задание на печать, начинается собственно цикл, включающий в
себя две интересующих нас функции —
size=2>OnPrepareDC
и OnPrint,
которые библиотека вызывает для каждой


печатаемой страницы, сообщая представлению ее номер в поле m_nCurPage
структуры CPrintlnfo. Первая функция
служит для решения трех основных задач:



  •  определение области вывода (view
    port)
    ;
  •  осуществление проверки на конец документа;
  •  посылка на принтер специальных ESC-кодов (при необходимости).

Следует также отметить, что эта функция вызывается как для печати документа,
так и для отображения его на экране. Различие заключается в первом передаваемом
ей параметре -т- указателе на контекст принтера или экрана — и в том, что при
выводе на экран в качестве второго параметра передается
size=2>NULL
. Для самой печати страницы предназначена функция
face="Courier New" size=2>OnPrint
, и передаваемые ей параметры несут всю
необходимую для этого информацию. Однако, особенно если посмотреть на ее
реализацию по умолчанию в классе CView.



void CView::OnPrint(CDC* pDC,
CPrintlnfo*) 


{


ASSERT_VALID(pDC);


OnDraw(pDC);


}


приходишь к выводу, что более правильным подходом является такой, при котором
эта функция "занимается своим делом", т. е. отвечает за изображение данных,
специфичных именно для вывода на принтер, например, для печати колонтитулов и
примечаний, оставляя всю остальную часть работы функции
size=2>OnDraw
.


Примечание 


Действительно — зачем дублировать код, если в Windows
организация вывода не зависит от конкретного устройства (аппаратно-независимый
вывод).


Завершается цикл печати вызовом функций
size=2>CDC::EndDoc
и
size=2>OnEndPrinting
. И если первая функция завершает процесс печати
документа, то вторая призвана освободить все использованные при печати ресурсы
GDI.


Примечание 


...если вы все-таки последовали рекомендациям и запросили
их у системы в функции
size=2>OnBeginPrinting
.


Таким образом, для того чтобы "организовать" процесс печати, используя
возможности библиотеки MFC, достаточно переопределить некоторые (или все) из
функций OnPreparePrinting,
face="Courier New" size=2>OnBeginPrinting
,
size=2>OnPrepareDC
, OnPrint и
OnEndPrinting. Правда, и это немало —
чего стоит только определение длины документа!


В заключение обсуждения организации вывода документа на принтер рассмотрим
пример переопределения перечисленных функций. Подробные комментарии делают
излишним более детальное их обсуждение. Скажем лишь, что рассматриваемые
фрагменты демонстрируют вывод колонтитула и номера страницы при печати
документа.



void CNoteView::OnPrint(CDC*
pDC, CPrintlnfo* plnfo) 


{


CNDApp *pApp =
(CNDApp*)AfxGetApp();


// Создаем контекст
устройства для принтера


CDC dc;



size=2>pApp->CreatePrinterDC(dc);


// Определяем размеры бумаги,
исходя из установок принтера


CSize sizePaper =
CSize(dc.GetDeviceCaps(HORZSIZE)*10,



size=2>dc.GetDeviceCaps(VERTSIZE)*10);


CRect rect(0, 0,
sizePaper.ex, sizePaper.cy);


// Учитываем величины
полей


rect.left +=
pApp->m_rtMargin.left;


rect.right -=
pApp->m_rtMargin.right;


rect.top -=
pApp->m_rtMargin.top;


rect.bottom +=
pApp->m_rtMargin.bottom;


// Преобразуем логические
координаты в физические 



size=2>pDC->LPtoDP(&rect);


// Изменяем параметры
прямоугольника рисования



size=2> pIhfo->m_rectDraw.left = rect.left; 


pInfo->ra_rectDraw.right =
rect.right; 


pInfo->m_rectDraw.top =
rect.top; 


pInfo->m_rectDraw.bottom =
rect.bottom; 


// Устанавливаем новые
координаты области вывода



size=2> pDC->SetViewportOrg(rect.left, rect.top); 


CString strHeader =
GetDocument()->GetTitle();


 // Печатаем
заголовок 


PrintHeader(pDC, plnfo,
strHeader);


 // Рисуем данные
документа OnDraw(pDC); 



void
CNoteView::PrintHeader(CDC *pDC,


CPrintlnfo *plnfo,


 CString
strHeader) 


{


// Устанавливаем выравнивание
влево



size=2>pDC->SetTextAlign(TA_LEFT);


// Для учета величины
смещения получаем


// характеристики
шрифта


TEXTMETRIC tm;



size=2>pDC->GetTextMetrics(&tm);


int у = tm.tniHeight +
15;


// Выводим заголовок


pDC->TextOut(25, у,
strHeader);


// Формируем смещение для
линии


у -= tm.tmHeight +5;


// Определяем длину
текста


CSize len =
pDC->GetTextExtent(strHeader);


// Рисуем разделительную
линию


pDC->MoveTo(0,
у);. 


pDC->LineTo(len.cx + 250,
у);


// Устанавливаем выравнивание
вправо



size=2>pDC->SetTextAlign(TA_RIGHT);


// Формируем строку с номером
страницы


TCHAR szBuf[32];


wsprintf(szBuf, "%d",
p!nfo->m_nCurPage);


// Выводим номер страницы в
правом нижнем углу



size=2>pDC->TextOut(pInfo->m_rectDraw.right - 525,


pInfo->m_rectDraw.bottom —
1250, szBuf);


 }



Предварительный просмотр документа


Помимо рассмотренных возможностей по выводу документа на экран и на принтер,
библиотека MFC поддерживает еще один не менее важный и интересный режим. Речь
идет о предварительном просмотре документа перед печатью, т. е. получении на
экране образа одной или нескольких страниц в том виде, в каком они будут
выведены на принтер.


Для начала перечислим те возможности, которые библиотека предоставляет "по
умолчанию". Другими словами — то, что получаешь, добавив к своей программе
единственную строчку кода в карту сообщений своего класса представления:


ON_COmMD(ID_FILE_PRINT_PREVIEW,
CScrollView: :OnFilePrintPreview)


Примечание


...если за вас это еще не сделал мастер
face="Courier New" size=2>AppWizard
(надеемся, что не требует пояснения
возможность использования вместо класса
size=2>CScrollView
любого другого класса представления).


А возможности достаточно широки и включают, помимо отображения уменьшенного
образа одной или двух страниц документа, печать изображаемых страниц или всего
документа, переход к предыдущей и/или следующей странице, масштабирование
изображения и выход из режима предварительного просмотра. А если предварительно
сообщить библиотеке MFC размер документа, т. е. число страниц, то она
дополнительно выведет полосу прокрутки для перехода от одной страницы к другой.


Но... Нет предела совершенству — всегда хочется чего-то большего! И
библиотека MFC предоставляет достаточно широкие возможности для реализации
собственных замыслов. Начнем с самого простого, опустив вопросы различия
контекстов принтера и экрана.


Для режима предварительного просмотра характерна та же последовательность
действий, что и при выводе на печать (см. рис. 19.2). Библиотека MFC сама
формирует необходимый контекст устройства. Поэтому, как и при печати документа,
задачей программиста является всего лишь переопределение функций
face="Courier New" size=2>OnPreparePrinting, OnBeginPrinting, OnPrepareDC,
OnPrint
и OnEndPrinting. Поскольку
эти действия достаточно просты, ограничимся несколькими фрагментами кода
программы (с подробными комментариями), которые иллюстрируют описываемый
материал на примере вывода рамки вокруг текста в режиме предварительного
просмотра (рис. 19.4).



BOOL
CNoteView::OnPreparePrinting(CPrintlnfo* plnfo) 


{


if (plnfo != NULL &&
!pInfo->m__bPreview)


{


// Подготовка данных для
инициализации блока диалога


// Print (Печать)


}


// Не забываем вызвать -
функцию базового класса


return
DoPreparePrinting(plnfo);


 }


void CNoteView::OnPrint(CDC*
pDC, CPrintlnfo* plnfo) 


{


...


// В режиме предварительного
просмотра рисуем рамку вокруг текста


 if (plnfo != NULL
&& p!nfo->m_bPreview)


 DrawMargins(pDC,
rect);


...


// Выводим сам текст


OnDraw(pDC);



 void
CNoteView::DrawMargins(CDC* pDC, CRect &rt) 


{


CNDApp *pApp =
(CNDApp*)AfxGetApp();


if (pDC->m_hAttribDC !=
NULL)



CRect rect, rectMargin =
pApp->m_rtMargin;


// Устанавливаем границы для
рамки 


rect.left =
pApp->m_rtMargin.left — 5; 


rect.right = rt.right —
pApp->m_rtMargin.right + 10; 


rect.top =
-pApp->m_rtMargin.top; 


rect.bottom = -rt.bottom +
pApp->m_rtMargin.bottom; 


// Создаем "карандаш"


CPen pen(PS_DOT, 0,
pDC->GetTextColor());


 // Выбираем его в
контекст устройства 


CPen* ppen =
pDC->SelectObject(&pen); 


// Рисуем рамку
pDC->MoveTo(0, rect.top);


 pDC->LineTo(10000,
rect.top); 


pDC->MoveTo(rect.left,
0); 


pDC->LineTo(rect.left,
-10000); 


pDC->MoveTo(0,
rect.bottom);


pDC->LineTo(10000,
rect.bottom);



size=2> pDC->MoveTo(rect.right, 0) ; 



size=2> pDC->LineTo(rect.right, -10000); 


// Удаляем карандаш из
контекста устройства 



size=2>pDC->SelectObject(ppen); 



}



...........................................................................4

Рис. 19.4. Режим предварительного просмотра документа


Рассмотренной техники вполне достаточно в подавляющем большинстве случаев.
Однако разработчики библиотеки MFC изменили бы себе, если бы не предоставили
дополнительные возможности для работы в этом-режиме.


Итак, при выполнении команды
size=2>ID_FILE_PRINT_PREVIEW
вместо непосредственного отображения образа
документа на принтере необходима его эмуляция на экране. Для этого в библиотеке
MFC реализованы два специальных класса:
size=2>CPreviewDC
и CPreviewView.
Основную роль в эмуляции принтера играет объект класса
size=2>CPreviewDC
, производного от
size=2>CDC
. Как известно, все объекты CDC содержат члены двух контекстов
устройства — собственно контекст устройства и контекст отображения, которые
обычно совпадают. Но у объекта класса
size=2>CPreviewDC
они используются для разных целей: контекст устройства
представляет принтер, а контекст отображения — экран, на который и
осуществляется вывод. И когда приложение выполняет какие-либо операции,
изменяющие характеристики контекста принтера, библиотека MFC автоматически
выполняет необходимые операции .эмуляции для контекста экрана. Например, если
приложение устанавливает какой-либо шрифт для печати, то библиотека выбирает
шрифт для экрана, который эмулирует шрифт принтера.


Вторым классом, участвующим в организации работы режима предварительного
просмотра, является CPreviewView,
базирующийся на классе CView. Этот класс
предоставляет поддержку для уникальных особенностей, окна предварительного
просмотра, таких как отображение и функционирование панели инструментов,
возможность просмотра одной или двух страниц, изменение масштаба изображения,
например, увеличение просматриваемого образа. Класс спроектирован достаточно
органично и в большинстве случаев нет надобности непосредственно вызывать или
переопределять какую-либо его функцию. Другое дело, если требуется реализовать
свой интерфейс для предварительного просмотра (например, если необходима
поддержка редактирования в этом режиме). Для тех, кому это может понадобиться,
рассмотрим последовательность действий.


Поскольку все начинается с выбора команды
size=2>ID_FILE_PRINT_PREVIEW
, которой соответствует обработчик
face="Courier New" size=2>OnFilePrintPreview
, рассмотрим его реализацию,
предоставляемую по умолчанию — ведь при переопределении придется делать нечто
подобное:



void
CView::OnFilePrintPreview()


 {


CPrintPreviewState* pState =
new CPrintPreviewState;


if
(!DoPrintPreview(AFX_IDD_PREVIEW_TOOLBAR, this,


RUNTIME_CLASS(CPreviewView),
pState))


{


TRACED("Error: DoPrintPreview
failed.n");



size=2> AfxMessageBox(AFX_IDP_COMMAND_FAILURE);


 delete
pState; 



}


Для нас интерес здесь представляют структура библиотеки MFC
face="Courier New" size=2>CPrintPreviewState
и функция
face="Courier New" size=2>DoPrintPreview.
Начнем со структуры:



struct CPrintPreviewState
{


UINT nIDMainPane; //
Идентификатор скрываемой основной области



HMENU hMenu; // Сохраненный
дескриптор меню


DWORD dwStates; // Состояние
видимости панелей элементов


// управления


CView *pViewActive01d; //
Сохраненное представление 


// Указатель на функцию,
позволяющую "безопасно" выйти 


// из режима предварительного
просмотра 


BOOL(CALLBACK
*lpfnCloseProc)(CFrameWnd *pFrameWnd); 


HACCEL hAccelTable; //
Сохраненная таблица командных клавиш


 CPrintPreviewState();
// Конструктор


};


Основным ее назначением является сохранение параметров активного фрейма,
которые он имел перед переходом в режим предварительного просмотра. При
необходимости их в этом режиме можно использовать.


Основную роль играет, конечно, функция
size=2>DoPrintPreview
:



BOOL
CView::DoPrintPreview (


UINT nIDResource,


CView* pPrintView,


CRuntimeClass*
pPreviewViewClass,


CPrintPreviewState*
pState)


Выполняет основную работу для подготовки и
перехода в режим предварительного просмотра. Параметры: nIDResource—
идентификатор ресурса панели инструментов в режиме предварительного просмотра;
pPrintView— указатель на объект "представление", для которого выполняется
предварительный просмотр (чаще всего используется значение this, но оно может
быть и другим, если режим предварительного просмотра реализуется не для одного
представления); pPreviewViewClass— указатель на runtime-структуру класса
CPreviewView, что необходимо для динамического создания объекта этого класса
во время выполнения функции; pState— указатель на структуру CPrintPreviewState
(или производную от нее, если требуются какие-либо дополнительные параметры),
которая должна создаваться именно здесь — функция DoPrintPreview немодальная,
и структура существует до завершения работы в этом режиме.


Для того чтобы совершенно ясно представлять важность действий, выполняемых
этой функцией, перечислим основные задачи, которые она решает:



  •  Создание объекта класса
    size=2>CPreviewView
    , обеспечивающего поддержку уникальных особенностей
    окна предварительного просмотра, таких, например, как отображение и
    функционирование панели инструментов.
  •  Создание панели инструментов на основе шаблона, задаваемого своим
    идентификатором. Это может быть как стандартный (
    size=2>AFX_IDD_PREV1EW_

    size=2>TOOLBAR
    ), так и созданный программистом блок диалога.
  •  Создание и перевод в активное состояние окна Windows, базирующегося
    на объекте класса CPreviewView.
  •  Установка параметров структуры
    size=2>CPrintlnfo
    , необходимой как при печати, так и при
    предварительном просмотре документа; в последнем случае полю
    face="Courier New" size=2>m_bPreview
    присваивается значение
    face="Courier New" size=2>TRUE
    .
  • Вызов рассмотренных ранее функций On
    Prepare Printing
    и On Begin
    Printing.
  •  Определение размеров текущего листа бумаги и вывод на экран текущей
    страницы.

Как видите, задач много, и если кто-то вместо предоставляемой
face="Courier New" size=2>DoPrintPreview
захочет реализовать свою
функцию, то не следует выпускать какую-либо из них из поля зрения. Но прежде чем
это делать, стоит задаться вопросом: "А зачем?", и только после получения
четкого ответа продолжать работать в этом направлении. В действительности
библиотека MFC предоставляет достаточный простор для творчества и без такого
рода работы, позволяя активно использовать механизм виртуальных функций. Вот и
для режима предварительного просмотра она реализует две такие функции:


virtual void
CFrameWnd::OnSetPreviewMode (


BOOL bPreview,


CPrintPreviewState
*pModeStuff)



Переводит главное окно приложения в режим
предварительного просмотра и обратно, в зависимости от значения параметра
bPreview. Реализация по умолчанию блокирует все стандартные панели
инструментов и скрывает основное меню и рабочую область главного окна
приложения, т. е. переводит фрейм MDI во временный фрейм SDI. При
переопределении следует вызывать аналогичную функцию базового класса для
проведения необходимых инициализирующих действий. Параметр pModeStuff содержит
указатель на структуру CPrintPreviewState
.


virtual void
CFrameWnd::OnEndPrintPreview (


CDC *pDC, 


CPrintlnfo *plnfo POINT
point, 


CPreviewView *pView)


Вызывается библиотекой MFC, когда
пользователь выходит из режима предварительного просмотра. Реализация этой
функции по умолчанию вызывает функцию OnEndPrinting и восстанавливает главное
окно приложения в том состоянии, которое оно имело до начала предварительного
просмотра. При ее переопределении необходим вызов функции базового класса
OnEndPrintPreview после всех дополнительных действий. Параметр point
определяет последнюю изображаемую точку страницы в режиме предварительного
просмотра, a pView указывает на используемый объект "представление". Именно
внутри этой функции следует освободить занимаемую структурой
CPrintPreviewState память. На структуру указывает pState, значение которого
устанавливается функцией DoPrintPreview.


Представленных функций в подавляющем большинстве случаев вполне достаточно.
Переопределяя функции, можно без лишних усилий решать такие, например, задачи:



  •  ввести полосу прокрутки для доступа к страницам документа в режиме
    предварительного просмотра;
  •   в режиме предварительного просмотра отображать страницы не с
    первой, а с текущей;
  •   организовать различный вывод на принтер и в окно предварительного
    просмотра.

Естественно, список может быть значительно шире. Мы же в заключение этого
раздела приведем небольшой пример, иллюстрирующий некоторые из перечисленных
возможностей.



void
CDrawView::OnFilePrintPreview()


{


// При переопределении
функции CView::OnFilePrintPreview 


// необходимо самим создать
структуру для сохранения 


// текущего состояния
фрейма


CPrintPreviewState* pState =
new CPrintPreviewState; 


// Обязательный вызов, в
котором задаем идентификатор


 // блока диалога для
отображаемой панели инструментов


 if
(!DoPrintPreview(IDD_PREVIEW, this,


RUNTIME_CLASS(CPreviewView),
pState)) 


{


// Для отображения в окне
отладки


TRACED("Ошибка:
DoPrintPreview отработала неправильно.n");


// Для отображения на
экране



size=2>AfxMessageBox(AFX_IDP_COMMAND_FAILURE);


delete pState; 



}


Внешний вид новой панели инструментов, активизирующейся в режиме
предварительного просмотра, представлен на рис. 19.5.


Поскольку как при выводе на принтер, так и в режиме предварительного
просмотра необходимо привязываться к размерам листа бумаги, в качестве еще
одного примера рассмотрим настройку блока диалога
size=2>Page Setup
(Параметры страницы) (рис. 19.6).



class CNoteView : public
CScrollView


{


...


public:


//{(AFX_MSG(CNoteView)


afx_msg void
OnPageSetup();


//}}AFX_MSG 


DECLARE_MESSAGE_MAP()


};



.......................................................................5

Рис.19.5. Окно предварительного просмотра с измененной панелью
инструментов



.......................................................................6

Рис. 19.6. Блок диалога Page
Setup



BEGIN_MESSAGE_MAP(CNoteView,
CScrollView)


 
//{{AFX_MSG_MAP(CNoteView) 


ON_COMMAND(ID_PAGE_SETUP,
OnPageSetup)


 //}}AFX_MSG_MAP


...


END_MESSAGE_MAP()


...


void
CNoteView::OnPageSetup() 


{


CNDApp *pApp =
(CNDApp*)AfxGetApp();


 // Создаем объект блока
диалога Page Setup 


CPageSetupDialog dig;


Настройка внешнего вида
осуществляется с помощью структуры


 AGESETUPDLG& psd =
dlg.m_psd;


// Будем настраивать значения
полей, а размеры задаются


//в сотых долях
миллиметра


psd.Flags |= PSD_MARGINS |
PSD_INHUNDREDTHSOFMILLIMETERS;


// Устанавливаем необходимые
значения


psd.rtMargin.left =
pApp->m_rtMargin.left*10;


psd.rtMargiii. right =
pApp->m_rtMargin.right*10;


psd.rtMargin.top =
pAppJ>m_rtMargin.top*10;


psd.rtMargin.bottom =
pApp->m_rtMargin.bottom*10;


// Для фиксации значений
получаем параметры принтера


PRINTDLG pd;


pd.hDevNames = NULL;


pd.hDevMode = NULL;



size=2>pApp->GetPrinterDeviceDefaults(Spd);


psd.hDevNames =
pd.hDevNames;


psd.hDevMode =
pd.hDevMode;


// Выводим блок диалога на
экран


if (dlg.DoModaH) ==
IDOK)


{


// Если пользователь нажал
кнопку ОК, фиксируем его установки


pApp->m_rtMargin.left =
psd.rtMargin.left/10;


pApp->m_rtMargin.right =
psd.rtMargin.right/10;


pApp->m_rtMargin.top =
psd.rtMargin.top/10;


pApp->m_rtMargin.bottom =
psd.rtMargin.bottom/10;


// При необходимости заменяем
принтер,


// используемый по
умолчанию



size=2>pApp->SelectPrinter(psd.hDeVNames, psd.hDevMode, FALSE);


CDC dc;



size=2>pApp->CreatePrinterDC(dc);


// Получаем размеры
бумаги


pApp->m_sizePaper =
CSize(dc.GetDeviceCaps(HORZSIZE)*10,



size=2>dc.GetDeviceCaps(VERTSIZE)*10) ;


// После того как были
изменены параметры страницы,


 // необходимо обновить
изображение данных на экране


 CNoteDoc* pDoc =
(CNoteDoc*)GetDocument (); 


// Сообщение об обновлении
передается всем представлениям, 


// ассоциированным с
документом, но реально предназначается 


// только объекту класса, на
который указывает this 


pDoc->UpdateAHViews (NULL,
0, this); 


}


 }


По материаллам сайта: www.realcoding.net

Категория: Интиресные статьи | Просмотров: 381 | Добавил: epidemic | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
  Личный кабинет

Привет: Зашедший

Сообщения:
$$$ для web-мастеров
Гость, мы рады вас видеть. Пожалуйста
зарегистрируйтесь или
авторизуйтесь!

  Календарь

  Наши Друзья

Effectt.com - система обмена ссылками. обмен ссылками: добавить ссылку, прямые ссылки

Получить WMR-бонус на свой кошелек!
Linq.RU - Обмен ссылками
  Статистика сайта

Всего connect: 1
Зашедших: 1
Зареганых: 0

статистика Top 100: Развлечения, игры, юмор Бесплатная раскрутка сайта
Copyright Epidemic © 2019Используются технологии uCoz