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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: вывод графики на принтер в масштабе  (Прочитано 22972 раз)
0 Пользователей и 10 Гостей смотрят эту тему.
hifi
Интересующийся

ru
Offline Offline

« : 23-08-2010 13:44 » 

Проблема такая. SDI приложение на MFC, VS2008. СView порожден от CScrollView, поскольку изображение, которое рисуется средствами GDI+ может иметь довольно большую ширину. Для рисования исходных данных в окне все данные сначала масштабирую таким образом, чтобы они помещались в окне. С этим все нормально.
Но вот с выводом на печать  проблема. Нужно выводить графику в реальном масштабе скажем 1:200, 1:100 и т.д. К тому же поскольку картинка имеет большой размер по ширине, то на одну печатную страницу, например, для бумаги в формате A4  она не помещается и нужно использовать многостраничную печать. И вообще как узнать реальный масштаб того что рисуется на экране. Ведь насколько я понимаю все будет зависеть от разрешения монитора, принтера, режима отображения и много чего еще. Все что накопал в литературе работает, но не так. Про вывод на печать в масштабе вообще ничего не нашел. И как с этим жить? Дайте за что-нибудь зацепиться. Буду балгодарен за ответы, обсуждение
Записан

Живут же люди. Влюбляются, ходят в библиотеки
Джон
просто
Администратор

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

« Ответ #1 : 23-08-2010 14:14 » 

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

Абсолютно правильно понимаешь.

Цитата
Все что накопал в литературе работает, но не так.

Показывай, что накопал и что не так работает?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
hifi
Интересующийся

ru
Offline Offline

« Ответ #2 : 23-08-2010 14:18 » 

Код:
void Cex05cView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{

// TODO: добавьте специализированный код или вызов базового класса
CScrollView::OnPrepareDC(pDC, pInfo);

if(pInfo == NULL)
return;

int CurRow = pInfo->m_nCurPage/m_NumCols +
(pInfo->m_nCurPage % m_NumCols > 0);
int CurCol = (pInfo->m_nCurPage-1) % m_NumCols + 1;

pDC->SetViewportOrg(-m_PageWidth *(CurCol-1),
-m_PageHeight*(CurRow-1));
//
}


// печать Cex05cView

BOOL Cex05cView::OnPreparePrinting(CPrintInfo* pInfo)
{
// подготовка по умолчанию
return DoPreparePrinting(pInfo);
}

void Cex05cView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: добавьте дополнительную инициализацию перед печатью
m_PageHeight = pDC->GetDeviceCaps(VERTRES);//(LOG)
m_PageWidth  = pDC->GetDeviceCaps(HORZRES);//

//m_wells.scale(m_PageWidth,m_PageHeight);

m_NumRows = m_wSheet_Height/m_PageHeight + (m_wSheet_Height % m_PageHeight >0);
m_NumCols = m_wSheet_Width /m_PageWidth  + (m_wSheet_Width  % m_PageWidth  >0);

pInfo->SetMinPage(1);
pInfo->SetMaxPage(m_NumRows * m_NumCols);

CScrollView::OnBeginPrinting(pDC,pInfo);
}

void Cex05cView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: добавьте очистку после печати
}

void Cex05cView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
// TODO: Add your specialized code here and/or call the base class
Graphics graphic(pDC->m_hDC);
myobject.DrawGraphic(graphic,260,120);
CScrollView::OnPrint(pDC, pInfo);
}
« Последнее редактирование: 23-08-2010 14:56 от Вад » Записан

Живут же люди. Влюбляются, ходят в библиотеки
hifi
Интересующийся

ru
Offline Offline

« Ответ #3 : 23-08-2010 14:21 » 

Примерно вот так реализовал печать, но печатает черт те что
Записан

Живут же люди. Влюбляются, ходят в библиотеки
Джон
просто
Администратор

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

« Ответ #4 : 24-08-2010 06:27 » 

Подожди, если я правильно понял, то у тебя мешанина из GDI и gdi+. Правильно? Те подготовку DC ты делаешь средствами GDI, а сам объект у тебя рисует в 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."
hifi
Интересующийся

ru
Offline Offline

« Ответ #5 : 24-08-2010 06:30 » 

Похоже, что так.

А как по-дРугому взаимодействовать с принтером? Я, можно сказать, новичок в программировании по Windows.
« Последнее редактирование: 24-08-2010 06:38 от Sel » Записан

Живут же люди. Влюбляются, ходят в библиотеки
Джон
просто
Администратор

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

« Ответ #6 : 24-08-2010 08:46 » 

Да нет, с принтером ты взаимодействуешь нормально. Только я тебе советую пользоваться полностью gdi+. Это делается примерно так:

1. Ты получаешь DC принтера и передаёшь его как есть gdi+ объекту. Graphics graphic(pDC->m_hDC);

2. Перед тем как передать graphic твоему объекту, ты устанавливаешь нужные тебе параметры с помощью ф-ций этого объекта:

SetPageUnit
SetPageScale
ScaleTransform

и тп

Всё. Вот так примерно это выглядит вживую. У меня только есть небольшая ососбенность, в моём проекте я ещё должен изменять настройки драйвера у конкретных принтеров, поэтому получаю DC не средствами MFC, но это сути не меняет. Вторая особенность, я использую микрометры при выводе графиков (требуется точность), поэтому такой масштаб и деление единиц на 1000.

1. DC
        
Код:
HDC hdcPrn = CPrinterHelper::CreatePrinterDC(stPrinterName, ... для тебя не важно

if(hdcPrn==NULL)
{
TRACE0("Failed to select custom printer\n");
return FALSE;
}

CDC *pDC = new CDC;
pDC->Attach(hdcPrn);      // attach a printer DC

pDC->StartDoc("имя документа для спуллера");

2. Получаем необходимые параметры принтера:
Код:
        int nLogPixX = pDC->GetDeviceCaps(LOGPIXELSX);
int nLogPixY = pDC->GetDeviceCaps(LOGPIXELSY);
int cx = pDC->GetDeviceCaps(PHYSICALOFFSETX);
int cy = pDC->GetDeviceCaps(PHYSICALOFFSETY);
INT nX = (cx * 25400) / nLogPixX;
INT nY = (cy * 25400) / nLogPixY;

3. Эта часть в принципе не столь важна - некие сохранённые в моей программе настройки должны учитываться, я их здесь оставил, чтобы было примерно понятно, что за параметры передаются в ф-ции, ты можешь их просто неиспользовать, и, соответственно, не вызывать ф-ции, в основном это настройка границ печати (не каждый принтер покрывает 100% поверхности) и деформация отпечатка в результате проскальзывания бумаги (в моём случае это пластик):
Код:
        REAL fLeftMargin = (REAL)theApp.GetPrinterLeftMargin(stPrinterName); // это пользователь определил отступ
REAL fTopMargin = (REAL)theApp.GetPrinterTopMargin(stPrinterName);

fLeftMargin -= (REAL)nX; // printer border correction // учитываем отступ самого принтера
fTopMargin -= (REAL)nY; // printer border correction

CSize szFineAdjst = theApp.GetPrnFineAdjust(stPrinterName); // точная корректировка (определяется специальными тестами - тебе не важно)

fLeftMargin += szFineAdjst.cx;
fTopMargin += szFineAdjst.cy;

// Printer Corection
REAL fXCorrection = GetPrinterCorrectX(stPrinterName); // аналогично
REAL fYCorrection = GetPrinterCorrectY(stPrinterName);

fLeftMargin /= fXCorrection;
fTopMargin /= fYCorrection;

3. Ну и наконец настройка gdi+ объекта:
Код:
	Graphics *pgrMem = Graphics::FromHDC(pDC->GetSafeHdc());
pgrMem->SetSmoothingMode(SmoothingModeNone);
pgrMem->SetPageUnit(UnitMillimeter);
pgrMem->SetPageScale((REAL)0.001);
pgrMem->SetPixelOffsetMode(PixelOffsetModeHalf);
 
// apply corrections
pgrMem->ScaleTransform(fXCorrection, fYCorrection);
pgrMem->TranslateTransform(fLeftMargin, fTopMargin);

После этого я передаю его моему объекту для отрисовки данных. Ты ессно можешь менять размер SetPageScale и установить свои единицы измерения SetPageUnit. Если размер твоей страницы больше, чем помещается на лист, то юзаешь ф-ю TranslateTransform для установки нового "начала". Допустим у тебя не поместилось по высоте, а отпечаталось только h, значит тебе надо сместить по оси Y на h.

Внимательно прочитай MSDN  к каждой ф-ции, какие параметры она получает и тп.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
hifi
Интересующийся

ru
Offline Offline

« Ответ #7 : 24-08-2010 14:26 » 

Спасибо, Джон. Обязательно попробую. Как сделаю отпишусь.
Записан

Живут же люди. Влюбляются, ходят в библиотеки
hifi
Интересующийся

ru
Offline Offline

« Ответ #8 : 24-08-2010 14:30 » 

Только еще один вопрос. Как ты делаешь графику в GDI+ без участия GDI. И еще ты говоришь, что рисуешь в мм. А если у меня объект 3x5 метров. Мне, что переводить все в мм или рисовать в пикселах, что выбрать?
Записан

Живут же люди. Влюбляются, ходят в библиотеки
Джон
просто
Администратор

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

« Ответ #9 : 24-08-2010 19:31 » 

1. Ну во-первых, если хочешь разобраться с графикой - читай Петцольда, у него всё очень толково написано. А во-вторых, gdi+ это ничто иное, как надстройка над GDI, упаковка если хочешь  (под виндой ваще кроме GDI ничего нет). Просто gdi+ гораздо удобней в использовании. Те фактически всё рисуется в GDI, только ты про это не "знаешь" Ага .

2. У меня максимальные размеры не превышают формат A4, да и принтеры "врут" безбожно, но клиенту захотелось микронной точности, поэтому я устанавливаю единицы - мм, и делю их на тысячу SetPageScale((REAL)0.001). Тогда все значения координат у меня в микронах. Те если мне надо провести линию длиной в 5 мм, то координаты будут от 0 до 5000.
В твоём случае всё зависит от точности ввода. Если например ты говоришь, что у тебя фигурируют только сантиметры, как минимальная единица измерения, то тебе надо умножить на 10. Если дециметры, то на 100. В последнем случае размер твоей "картинки" будет 30х50, в первом - 300х500. Вот и вся разница. Всё зависит от требуемой точности. Ну и если тебе хочется распечатать твой "холст", например, на А4 в ужатом виде, то тебе надо его смасштабировать в пропорции 500 : 29,7.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
hifi
Интересующийся

ru
Offline Offline

« Ответ #10 : 26-08-2010 13:20 » 

Джон! Такое чувство, что у меня в голове каша какая-то с масштабом. Вразуми пжста на конкретном примере. Пока без печати, только рисование на экране. Допустим у меня есть прямоугольник 2Х5 метров. Я его хочу увидеть на экране. Привожу код функции OnDraw. Без какого либо масштабирования.
Записан

Живут же люди. Влюбляются, ходят в библиотеки
hifi
Интересующийся

ru
Offline Offline

« Ответ #11 : 27-08-2010 07:05 » 

Вот что получилось при отрисовке в масштабе на экране. Вставил в функцию OnDraw следующий код:
Код:
		//строны прямоугольника
REAL Width_m  = 30.0;//0.25; // meters
REAL Height_m = 50.0;//50; // meters

REAL Width_mm  = Width_m *1000; // millimeters
REAL Height_mm = Height_m*1000; // millimeters

// TODO: add draw code for native data here

Graphics graphic(pDC->m_hDC);

        //Устанавливаю страничные единицы
graphic.SetPageUnit(UnitMillimeter);
//пока закоментировал, чтоб масштабировать по осям независимо
//graphic.SetPageScale(0.01f);

REAL dpiX = graphic.GetDpiX();
REAL dpiY = graphic.GetDpiY();

REAL pixelX = (Width_mm +10.0f) * dpiX / 25.40f;
REAL pixelY = (Height_mm+10.0f) * dpiY / 25.40f;

        // Устанавливаю размеры для полосы прокрутки
CSize sizeTotal(pixelX, pixelY);
CSize sizePage(sizeTotal.cx / 2, sizeTotal.cy / 2);
CSize sizeLine(sizeTotal.cx / 70, sizeTotal.cy / 70);
SetScrollSizes(MM_TEXT, sizeTotal);


//переворачиваю отражением ось y
Matrix mx(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
//перемещаю начало координат в левый нижний угол
float dx = 0.0f;
float dy = Height_mm;//5000.0f;
mx.Translate(dx,dy,MatrixOrderAppend);

//немного смещаю объект, чтоб было видно границы
mx.Translate(5.0f,5.0f,MatrixOrderAppend);

//масштабирую объект
mx.Scale(0.002f,0.002f,MatrixOrderAppend);

graphic.SetTransform(&mx);


// вывожу объект на экран
RectF region(0.0f,0.0f,Width_mm,Height_mm);

//выбираю перо
Pen  pen(Color(0,0,0),1);
//выбираю кисть
SolidBrush brush(Color(255,0,255,0));
//рисую
        graphic.DrawRectangle(&pen,region);
//заливаю
graphic.FillRectangle(&brush,region);
« Последнее редактирование: 27-08-2010 08:23 от Джон » Записан

Живут же люди. Влюбляются, ходят в библиотеки
hifi
Интересующийся

ru
Offline Offline

« Ответ #12 : 27-08-2010 07:08 » 

Единственное, что мне не нравится так это работа с полосой прокрутки. Пришлось все-таки использовать функцию SetScrollSizes(sizeTotal). Функция использует таки режим отображения MM_TEXT, то есть опять взаимодействие с GDI. По другому не знаю установить прокрутку
Записан

Живут же люди. Влюбляются, ходят в библиотеки
Джон
просто
Администратор

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

« Ответ #13 : 27-08-2010 08:22 » 

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

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

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

Код:
Point CMyView::ScreenToOwnUnit(const CPoint &point)
{
// scroll position correction
CPoint ptScrl = GetDeviceScrollPosition();
double dX = ((point.x+ptScrl.x)*(double)HIMETRIC_PER_INCH)/m_dpiX;
double dY = ((point.y+ptScrl.y)*(double)HIMETRIC_PER_INCH)/m_dpiY;
double dZoomFactor = GetDocument()->GetZoomFactor()*1000.0;
if(dZoomFactor>0.2)
{
dX /= dZoomFactor;
dY /= dZoomFactor;
}
return Point((INT)(dX+(dX<0?-0.5:0.5)),(INT)(dY+(dY<0?-0.5:0.5)));
}

CPoint CMyView::OwnToScreenUnit(const Point &point)
{
// scroll position correction
CPoint ptScrl = GetDeviceScrollPosition();
double dX = m_dpiX * point.X/(double)HIMETRIC_PER_INCH;
double dY = m_dpiY * point.Y/(double)HIMETRIC_PER_INCH;
double dZoomFactor = GetDocument()->GetZoomFactor()*1000.0;
if(dZoomFactor>0.2)
{
dX *= dZoomFactor;
dY *= dZoomFactor;
}
dX -= ptScrl.x;
dY -= ptScrl.y;

return CPoint((LONG)(dX+(dX<0?-0.5:0.5)),(LONG)(dY+(dY<0?-0.5:0.5)));
}

где const int HIMETRIC_PER_INCH = 25400; // дюйм в микронах, я просто использую эту константу для других целей, ты можешь сразу использовать в мм - 25.4
« Последнее редактирование: 27-08-2010 08:46 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Джон
просто
Администратор

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

« Ответ #14 : 27-08-2010 08:31 » 

Да, ещё один совет. Необязательно делать SetScrollSizes внутри OnDraw. Лучше сначала установить полосы прокрутки, а потом вызвать Invalidate. Сути это не менят, но повышает читаемость кода.

ps Да, и супругу с прошедшим Днём рождения, пусть будет толстенькой и розовощёкой!
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
hifi
Интересующийся

ru
Offline Offline

« Ответ #15 : 27-08-2010 09:13 » 

Я кину SetScrollSizes в OnUpdate она вызывается при каждом изменении окна. Не знаешь, как по другому установить прокрутку? без использования режимов отображения
Записан

Живут же люди. Влюбляются, ходят в библиотеки
Джон
просто
Администратор

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

« Ответ #16 : 27-08-2010 09:19 » 

Эммм не понял. Что значит "без использования режимов отображения" ?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
hifi
Интересующийся

ru
Offline Offline

« Ответ #17 : 27-08-2010 10:02 » 

Только не получается в другое место кинуть функцию, потому что размеры объекта подсчитываются в OnDraw через graphics.GetDpiX(). Те OnUpdate не знает про graphic. Хотя можно опросить через GetDeviceCaps - но это же опять мешанина?
Записан

Живут же люди. Влюбляются, ходят в библиотеки
hifi
Интересующийся

ru
Offline Offline

« Ответ #18 : 27-08-2010 10:05 » 

В смысле для рисования в GDI+ нам не нужно устанавливать старые режимы отображения для контекста экрана, а тут получается, что для прокрутки я должен настроить контекст экрана, устанавливая какой-либо режим отображения, типа M_TEXT
Записан

Живут же люди. Влюбляются, ходят в библиотеки
hifi
Интересующийся

ru
Offline Offline

« Ответ #19 : 27-08-2010 10:09 » 

И вот еще, когда я применяю масштабирование (имея в виду последний код) объект уменьшается в 500 раз. Но полосы размер области вывода остается без изменений и полосы прокрутки не исчезают. То есть получается что они не связаны между собой: картинка и размер  области вывода. Я имею в виду что после масштабирования по осям картинка уже маленькая, а при этом область прокрутки - большая. Есть каккие-нибудь идеи как их можно увязать?
Записан

Живут же люди. Влюбляются, ходят в библиотеки
Джон
просто
Администратор

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

« Ответ #20 : 27-08-2010 10:54 » new

К #17

Можешь использовать в OnUpdate

Graphics graphics(this->GetSafeHwnd());

и ты получишь разрешение монитора.

Или ещё лучше.

Я тебе выше привёл две ф-ции, но не заметил в них мемберов. Они инициаллизируются так:

Код:
void CMyView::UpdateResolutionInfo()
{
Graphics graphics(this->GetSafeHwnd());
m_dpiX = graphics.GetDpiX();
m_dpiY = graphics.GetDpiY();
}

те совсем не обязательно каждый раз при OnDraw вызывать ф-ции. Прикинь вероятность изменения пользователем разрешения монитора во время работы твоей программы. Практически их можно засунуть в константы. Но уж если хочешь сделать чисто, то вызывай ф-ю UpdateResolutionInfo() при смене системных настроек винды.
« Последнее редактирование: 27-08-2010 10:57 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
Джон
просто
Администратор

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

« Ответ #21 : 27-08-2010 11:08 » 

В смысле для рисования в GDI+ нам не нужно устанавливать старые режимы отображения для контекста экрана, а тут получается, что для прокрутки я должен настроить контекст экрана, устанавливая какой-либо режим отображения, типа M_TEXT

Это не совсем так. В том плане, что никаких уж таких больших различий в настройках нет. Как я уже сказал, gdi+ это только удобная красивая обёртка для GDI. В конечном итоге работает всё-таки GDI. Так что тут без разницы. Неудобство (потребность синхронизации) возникает только потому, что стандартные виндовские контролы работают с GDI. Может быть, когда-нить 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."
Джон
просто
Администратор

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

« Ответ #22 : 27-08-2010 11:22 » 

Есть какие-нибудь идеи как их можно увязать?

Ну а как их увязать? Полоса прокрутки должна обновляться после каждого изменения массштаба и графической информации (загрузил картинку с другим размером).

Пользователь меняет масштаб:

1. Пересчёт новых отображаемых размеров всей картинки
2. Установка параметров полос прокрутки
3. Invalidate

Луше добавить в CView метод, выполняющий эти три действия, и вызвать его когда необходимо.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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."
hifi
Интересующийся

ru
Offline Offline

« Ответ #23 : 18-11-2010 09:16 » 

Привет, Джон!

Извини, что долго не появлялся. С масштабом все получилось. Огромное спасибо за помощь!!!
Записан

Живут же люди. Влюбляются, ходят в библиотеки
Джон
просто
Администратор

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

« Ответ #24 : 18-11-2010 09:56 » 

Привет. "Заходи." (с) Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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