2013-05-11 3 views
0

В диалоговом окне mfc на основе CDispView выведен из CScrollView. Нужно увеличить масштаб до точки, когда нажимали кнопку мыши и уменьшали масштаб при нажатии правой кнопки мыши. Следующие работы частично. любой способ заставить его работать лучше ?. соответственно измените размеры полос прокрутки, увеличьте масштаб в точке и т. д.Как увеличить и уменьшить масштаб CScrollView Surface

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 на другой масштабный коэффициент и смещение для обеспечения эффекта масштабирования. Например, эта функция используется при печати. Он позволяет OnDraw быть одинаковым как для отображения на экране, так и для печати, изменяя масштаб CDC.

+0

Будет работать в этом случае, CDispView выведен из CScrollView? Я попробую. любые примеры ?. – user2045525

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); 
} 
Смежные вопросы