如何放大和缩小条CscrollView表面(How to zoom in and out on CS

2019-10-30 10:18发布

基于MFC对话框,CDispView从条CscrollView驱动。 需要在左点击时放大到一个点或缩小时,右点击。 下面的工作部分。 任何办法让它更好地工作? 因此调整滚动条,在一个点放大,等等。

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);
}

Answer 1:

基于MFC对话框:使用此代码,它会放大图像的右下部分,无论在哪里我点击可放大CDispView从条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);
}


Answer 2:

您可以覆盖的CView :: OnPrepareDC方法。 这是刚刚的OnDraw之前打来电话,是疾病预防控制中心调整到不同的比例因子的地方和偏移提供变焦效果。 例如,该功能用于打印时。 它允许的OnDraw对于两个屏幕显示和打印相同通过改变CDC的规模。



文章来源: How to zoom in and out on CScrollView Surface
标签: mfc