0

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

2 回答 2

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);
}
于 2013-05-12T05:25:18.307 回答
-1

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

于 2013-05-11T04:42:15.057 回答