Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Печать невидимой части окна  (Прочитано 8888 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ary
Гость
« : 06-05-2008 14:02 » 

Мой график измерений,отображаемый в CScrollView может быть значительно длиннее ширины экрана,приходится прокручивать окно с помощью горизонтального scrollbar'а.
Но при распечатке и при предварительном просмотре печати выходит только одна страница с той частью графика,которая видна при максимально открытом окне без дополнительной прокрутки.   
Как сделать,чтобы печаталась та часть,что находится за правой границей окна и видна только при прокрутке? 
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 06-05-2008 15:32 » 

Подготовь DC нужного размера чтобы на страницу принтера помещалась. Так у тебя область печати/отрисовки совпадает с видимым окном при разрешении 72dpi, у принтера же разрешение гораздо выше  - 300 dpi. Те ты можешь спокойно уменьшать для печати.
Исключение - если у тебя очень много и даже на страницу не помещается. Тогда надо разбивать на две страницы.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ary
Гость
« Ответ #2 : 07-05-2008 14:17 » 

Спасибо за подсказку,но я не знаю:
1.какой функцией можно "подготовить DC нужного размера чтобы на страницу принтера помещалась"
2.и если разбивать на 2 страницы-то как?
Можно пример?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 07-05-2008 15:30 » 

Да не за что

1. но дальше помочь, увы, не могу, ибо я не знаю как ты печатаешь? Ага (какой вопрос, такой ответ) Поэтому покажи код печати.

2. С использованием функций DC StartPage/EndPage; между вызовами этих ф-ций делаешь необходимые трансформации - перемещение, сдвиг и тп.

Пример:

offset = 0;

цикл пока не закончатся данные

if(pDC->StartPage())
{

       печатаем_со_смещением(offset);

       pDC->EndPage();

       offset += высота_страницы_принтера;
}

конец цикла

Типа такого. Кстати в gdi+ все трансформации делается очень просто.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
ary
Гость
« Ответ #4 : 08-05-2008 11:53 » 

Вот мой код:

В OnDraw считываются из массива вершины графика и отрисовываются:
Код:
void CGraphView::OnDraw(CDC* pDC)
{

...............
    int count= (int)sfp->lineV.GetSize();

 
    for (int i=0;i<count;i=i+2)
    {

cedge=sfp->lineV[i];
pparr[0]=cedge.point;
                  pparr[0].x=pparr[0].x-offset;
               
         COLORREF clr=sfp->lineV[i].color;

CPen pen;

pen.CreatePen(PS_SOLID,1,cedge.color);


pDC->SelectObject(&pen);

cedge=sfp->lineV[i+1];

pparr[1]=cedge.point;
                  pparr[1].x=pparr[1].x-offset;

         prevPoint = pparr[1];

     
pDC->Polyline(pparr,2);

 }
 


}


}


А здесь сама печать: 

Код:

void CGraphView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
if (m_pMemDC->GetSafeHdc()) m_pMemDC->DeleteDC();
m_pMemDC->CreateCompatibleDC(pDC);
 
CClientDC dc(this);
CRect rect;
GetClientRect(rect);
m_pMemDC->SetMapMode(MM_ISOTROPIC);
int ratiox0=dc.GetDeviceCaps(LOGPIXELSX);
int ratioy0=dc.GetDeviceCaps(LOGPIXELSY);
m_pMemDC->SetWindowExt(ratiox0,ratioy0);
int ratiox1=m_pMemDC->GetDeviceCaps(LOGPIXELSX);
int ratioy1=m_pMemDC->GetDeviceCaps(LOGPIXELSY);
m_pMemDC->SetViewportExt(ratiox1,ratioy1);

if (m_pBm->GetSafeHandle()) m_pBm->DeleteObject();
m_pBm->CreateCompatibleBitmap(&dc,rect.Width(),rect.Height());
m_pMemDC->SelectObject(m_pBm);
dc.DPtoLP(rect); //Convert to Logical Coordinates
m_rect = rect; //Save Logical Coordinates
         m_pMemDC->BitBlt(0,0,rect.Width(),rect.Height(),&dc,0,0,SRCCOPY);

}

void CGraphView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{


fromR=0;fromL=0;
         CEdge cedge;
int ind=0;
CPoint pparr[2];
prevPoint.x=-1;
prevPoint.y=-1;
   
pDC->SetMapMode(MM_ISOTROPIC);
pDC->SetWindowExt(m_pMemDC->GetDeviceCaps(LOGPIXELSX),m_pMemDC->GetDeviceCaps(LOGPIXELSY));

if(!pInfo->m_bPreview)
pDC->SetViewportExt(6*pDC->GetDeviceCaps(LOGPIXELSX),6*pDC->GetDeviceCaps(LOGPIXELSY));
else
{
pDC->SetWindowOrg(0,200);
pDC->SetViewportExt(pDC->GetDeviceCaps(LOGPIXELSX),pDC->GetDeviceCaps(LOGPIXELSY));
}..

Записан
ary
Гость
« Ответ #5 : 12-05-2008 07:08 » 

Пока не нашел как это сделать.Никто не может дать конкретный пример решения проблемы?
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 12-05-2008 17:57 » new

ary, сорри. Времени ща нет вобще. Вот заскочил на минутку.

Значит так. Навскидку. Две последние ф-ции вроде в порядке. Я с GDI давно игрался, в последнее время только с gdi+. ПОэтому всех тонкостей ща не вспомню, но вроде всё на своём месте. А вот в первой - OnDraw - я не вижу у тебя отрисовки привязанной к размерам DC. Те ты это либо не делаешь, либо просто не показал в примере. А это должно быть обязательно. Ты должен учитывать размер клиентской области и разрешение устройства вывода.

Грубо говоря - я рисую линию длинной например 10 точек, на экране при 72 dpi это занимает 10/72 дюйма, или 0,352 см - 3,5 мм. При печати 300 dpi, если я продолжаю выводить эти же 10 точек, у меня получается  10/300 = 0,847 см = 0,9 мм.

Тоже относится и к окну вывода.

Если тебе точность не важна и у тебя границы окна вывода как GetClientRect, то тебе надо при печати вызывать второй раз OnPaint сделав предварительно смещение с учётом положения скорлеера GetScrollPos 
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines