2013-05-11 182 views
0

基于mfc对话框,CDispView从CScrollView驱动。左键点击时需要放大点,右键点击时放大点。以下部分工作。任何方式使它工作更好?相应地调整滚动条的大小,放大点等。如何放大和缩小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); 
} 

回答

-1

您可以重写CView :: OnPrepareDC方法。它在OnDraw之前被调用,并且是将CDC调整为不同比例因子和偏移以提供缩放效果的地方。例如,打印时使用此功能。通过改变CDC的尺寸,它可以使OnDraw在屏幕显示和打印方面都相同。

+0

它会在这种情况下工作,CDispView从CScrollView驱动?我试试。任何例子? – user2045525 2013-05-11 05:58:48

0

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