in mfc dialog based, CDispView is drived from CScrollView. Need to zoom in to a point when left clicked on and zoom out when right clicked on. The following works partially. any way to make it work better?. resize the scroll bars accordingly, zoom in at a point,etc.
xzfac = 1;
yzfac = 1;
void CDispView::OnInitialUpdate()
{
SetScrollSizes(MM_TEXT, CSize(cWidth, cHeight));
CScrollView::OnInitialUpdate();
}
void CDispView::OnDraw(CDC* pDC)
{
StretchDIBits(pDC->GetSafeHdc(), 0, 0,
(xzfac * pBmpInfo->bmiHeader.biWidth),
(yzfac * pBmpInfo->bmiHeader.biHeight),
0, 0, pBmpInfo->bmiHeader.biWidth,
pBmpInfo->bmiHeader.biHeight,
imageBuf, pBmpInfo, DIB_RGB_COLORS,
SRCCOPY);
}
void CDispView::refresh()
{
OnInitialUpdate();
}
void CDispView::OnLButtonDown(UINT nFlags, CPoint point)
{
yzfac = yzfac + 1;
xzfac = xzfac + 1;
refresh();
RedrawWindow();
CScrollView::OnLButtonDown(nFlags, point);
}
void CDispView::OnRButtonDown(UINT nFlags, CPoint point)
{
yzfac = yzfac - 1;
if (yzfac < 1) yzfac = 1;
xzfac = xzfac - 1;
if (xzfac < 1) xzfac = 1;
refresh();
RedrawWindow();
CScrollView::OnRButtonDown(nFlags, point);
}
mfc dialog based: with this code, it zooms in lower right section of the image, no matter where I click on to zoom in. CDispView is derived from CScrollView.
int sWidth = imgWidth;
int sHeight = imgHeight;
int PtX = 0;
int PtY = 0;
int cHeight; //client
int cWidth; //client
int vWidth = imgWidth;
int vHeight = imgHeight;
void CDispView::OnInitialUpdate()
{
SetScrollSizes(MM_TEXT, CSize(cWidth, cHeight));
CScrollView::OnInitialUpdate();
}
void CDispView::OnDraw(CDC* pDC)
{
StretchDIBits( pDC->GetSafeHdc(),
0, 0,
cWidth,
cHeight,
0, 0,
vWidth,
vHeight,
imgBuffer,
pBmpInfo,
IB_RGB_COLORS,
SRCCOPY );
}
void CDispView::InitBitmapInfo()
{
pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pBmpInfo->bmiHeader.biWidth = vWidth;
pBmpInfo->bmiHeader.biHeight = vHeight;
..etc..
}
void CDispView::refresh()
{
OnInitialUpdate();
}
void CDispView::OnLButtonDown(UINT nFlags, CPoint pt)
{
long x, y;
x= PtX + (pt.x/cWidth * vWidth);
y= PtY + (pt.y/cHeight * vHeight);
vWidth = (int) (vWidth/2);
vHeight = (int) (vHeight/2);
PtX= x - (pt.x/cWidth * vWidth);
PtY= y - (pt.y/cHeight * vHeight);
if (PtX < 0)
{PtX= 0;}
if (PtY < 0)
{PtY= 0;}
long temp = sWidth - vWidth;
if (PtX > temp)
{
PtX = temp;
}
temp= sHeight - vHeight;
if (PtY > temp)
{
PtY = temp;
}
if (vWidth < 50)
{
vWidth = sWidth;
vHeight = sHeight;
PtX = 0;
vPt = 0;
}
refresh();
Invalidate(0);
CScrollView::OnLButtonDown(nFlags, pt);
}
void CDispView::OnRButtonDown(UINT nFlags, CPoint pt)
{
PtX = 0;
PtY = 0;
vWidth = imgWidth;
vHeight = imgHeight;
refresh();
Invalidate(0);
CScrollView::OnRButtonDown(nFlags, pt);
}
You can override the CView::OnPrepareDC method. It is called just before OnDraw and is the place to adjust the CDC to a different scale factor and offset to provide a zoom effect. For example, this function is used when printing. It lets OnDraw be the same for both screen display and printing by changing the scale of the CDC.