Knowledge Base Nr: 00298 scrollzoom.cpp - http://www.swe-kaiser.de

Downloads: source sample project

MFC: VS2005 Scaling in ScrollView mit mapping mode != MM_xxxISOTROPIC (z.b. MM_LOMETRIC, MM_HIMETRIC, ...)

  
- in h-file von view definieren
float fScale;
float fOldScale;
float Scale(float v) { return fScale*v; }

- initialisieren in OnInitialUpdate() oder Konstruktor
fScale = 1.2;

- messagehandler für zoom-faktor

void ClulliView::OnZoomZoomin()
{
fScale += 0.2;
if (fScale > 3.0)
fScale = 3.0;
Invalidate();
UpdateWindow();
RedrawWindow();
}

void ClulliView::OnZoomZoomout()
{
fScale -= 0.2;
if (fScale < 0.2)
fScale = 0.2;
Invalidate();
UpdateWindow();
RedrawWindow();
}

- drucken korrigieren (ohne zoom)
void ClulliView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
fOldScale = fScale;
fScale = 1;
}

void ClulliView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
fScale = fOldScale;
}

- scalierung beim zeichnen berücksichtigen
void ClulliView::OnDraw(CDC* pDC)
{
...
//font
CFont cfNew;
LOGFONT lf;
CFont* cfOld;

memset(&lf, 0, sizeof(LOGFONT));
lf.lfHeight = Scale(30);
wcscpy(lf.lfFaceName, CString("Arial"));
cfNew.CreateFontIndirect(&lf);

cfOld = pDC->SelectObject(&cfNew);

//seitengröße beim zoomen anpassen
CSize sizeTotal;
sizeTotal.cx = Scale(2100);
sizeTotal.cy = Scale(2900);
SetScrollSizes(MM_LOMETRIC, sizeTotal); //nicht möglich mit MM_ISOTROPIC!!!

CString str;

int x = -200;
int y = -200;
str.Format(CString("Zoom: %.2f - SetWindowOrg(%d/%d)"), fScale, x, y);
pDC->TextOut(Scale(500), Scale(-2800),str, str.GetLength());

//pDC->ScaleWindowExt(xNum, xDenom, yNum, yDenom); //keine auswirkung mapping mode MM_LOMETRIC!!!

//SetWindowExtEx() nicht mapping mode MM_LOMETRIC!!!
pDC->SetWindowOrg(Scale(x), Scale(y));

for (int i=0; i<30; i++)
{
x = Scale(i*50);
y = Scale(-2900 + i*50);
str.Format(CString("%d/%d lulli lulli"), x, y);
pDC->TextOut(x, y,str, str.GetLength());

pDC->MoveTo(0, 0);
pDC->LineTo(x, 0);
pDC->LineTo(x, y);
pDC->LineTo(0, y);
pDC->LineTo(0, 0);
}

pDC->SelectObject(cfOld);
cfNew.DeleteObject();
}