📄 navigationdialog.cpp
字号:
NavZoomOut.MoveWindow(60,clientRect.bottom-24,18,16,TRUE);
m_NavigationCtrl.MoveWindow(78,clientRect.bottom-24,100,15,TRUE);
NavZoomIn .MoveWindow(178,clientRect.bottom-24,18,16,TRUE);
bRedrawControl = FALSE;
}
//缩略图
HDIB hDIB = pDoc->m_hDIB;
if(hDIB==NULL) return;
DocSize=pDoc->m_sizeDoc;
CRect FillRect=clientRect;
clientRect.top=5;
clientRect.bottom=clientRect.bottom-35;
vRate=(float)DocSize.cy/clientRect.Height();
if((int)((clientRect.Width()-10)*vRate)<=DocSize.cx)
vRate=(float)DocSize.cx/(clientRect.Width()-10);
DisplayRect.top=(int)((clientRect.top+clientRect.bottom)/2.0-DocSize.cy/2.0/vRate);
DisplayRect.bottom=DisplayRect.top+(int)(DocSize.cy/vRate);
DisplayRect.left=(int)((clientRect.left+clientRect.right)/2.0-DocSize.cx/2.0/vRate);
DisplayRect.right=DisplayRect.left+(int)(DocSize.cx/vRate);
if(pbmp!=NULL) delete pbmp;
CBitmapDC bitmapDC(DisplayRect.Width(), DisplayRect.Height(),pDC);
rcDIB.top=rcDIB.left=0;
rcDIB.right=DocSize.cx;
rcDIB.bottom=DocSize.cy;
rcDest.top=rcDest.left=0;
rcDest.right=DisplayRect.Width();
rcDest.bottom=DisplayRect.Height();
PaintDIB(bitmapDC.m_hDC, &rcDest, hDIB, &rcDIB, pDoc->m_palDIB );
pbmp=bitmapDC.Close();
COLORREF bkColor=GetSysColor(COLOR_BTNFACE);
FillSolidRectUser( pDC, FillRect, DisplayRect,bkColor);
DrawBitmap(pbmp, pDC, DisplayRect, CPoint(0,0));
bpbmpChanged=FALSE;
}
else
DrawBitmap(pbmp, pDC, CRect(RedRect.left-1,RedRect.top-1,RedRect.right+1,RedRect.bottom+1),
CPoint(RedRect.left-1-DisplayRect.left,RedRect.top-1-DisplayRect.top));
//计算导航框
int mid;
CRect ViewClientRect;
pImageLayer->GetClientRect(&ViewClientRect);
if( ViewClientRect.Width() >= (int)(DocSize.cx * pImageLayer->m_Zoom) )
{
RedRect.left=DisplayRect.left;
RedRect.right=DisplayRect.right;
}
else
{
float xRate = DocSize.cx * pImageLayer->m_Zoom / DisplayRect.Width() ;
float length = ViewClientRect.Width() / xRate;
mid = (int)( (pImageLayer->ptDIBOff.x * pImageLayer->m_Zoom + ( ViewClientRect.left + ViewClientRect.right ) / 2 ) / xRate)+ DisplayRect.left;
RedRect.left = mid - (int)(length/2.0 +0.5) ;
RedRect.right= mid + (int)(length/2.0 +0.5) ;
}
if( ViewClientRect.Height() >= (int)(DocSize.cy * pImageLayer->m_Zoom) )
{
RedRect.top=DisplayRect.top;
RedRect.bottom=DisplayRect.bottom;
}
else
{
float yRate = DocSize.cy * pImageLayer->m_Zoom / DisplayRect.Height() ;
float length = ViewClientRect.Height()/ yRate;
mid = (int)((pImageLayer->ptDIBOff.y * pImageLayer->m_Zoom + ( ViewClientRect.top + ViewClientRect.bottom ) / 2 ) / yRate) + DisplayRect.top ;
RedRect.top = mid - (int)(length/2.0 +0.5);
RedRect.bottom= mid + (int)(length/2.0 +0.5);
}
//adjust it advance
if(RedRect.Width()<4)
{
RedRect.left -= (2-RedRect.Width()/2);
RedRect.right += (2-RedRect.Width()/2);
}
if(RedRect.Height()<4)
{
RedRect.top -= (2-RedRect.Height()/2);
RedRect.bottom += (2-RedRect.Height()/2);
}
if(RedRect.left < DisplayRect.left)
RedRect.OffsetRect(DisplayRect.left-RedRect.left,0);
if(RedRect.top < DisplayRect.top)
RedRect.OffsetRect(0,DisplayRect.top-RedRect.top);
if(RedRect.right > DisplayRect.right)
RedRect.OffsetRect(DisplayRect.right-RedRect.right,0);
if(RedRect.bottom > DisplayRect.bottom)
RedRect.OffsetRect(0,DisplayRect.bottom-RedRect.bottom);
//画边框
pDC->SelectStockObject(BLACK_PEN);
pDC->SelectStockObject(NULL_BRUSH);
pDC->Rectangle(DisplayRect.left-1,DisplayRect.top-1,DisplayRect.right,DisplayRect.bottom);
//画图象显示区域的红色方框
CPen Pen,*pOldPen;
Pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
pOldPen = pDC->SelectObject(&Pen);
pDC->Rectangle(RedRect);
pDC->SelectObject(pOldPen);
pDC->SelectStockObject(WHITE_BRUSH);
pDC->MoveTo(clrect.left+3,clrect.bottom-30);
pDC->LineTo(clrect.right-3,clrect.bottom-30);
ReleaseDC(pDC);
}
//在对话框中控制回车键的操作,使其不起作用
void CNavigationDialog::OnOK()
{
if( bActiveView == FALSE)
return ;
if(bEditChanged)
{
UpdateData(TRUE);
float nValue=(float)atof(m_scale_now);
if(nValue<0.1 || nValue>1600)
{
AfxMessageBox("0.10%到1600.00%之间的数字有效。\n匹配最接近的数字!",MB_ICONSTOP);
if(nValue>1600)
nValue=1600;
if(nValue<0.1)
nValue=0.1f;
}
CMYFUSIONView * pImageLayer = ((CMYFUSIONView *)((CMDIFrameWnd *)AfxGetApp()->
m_pMainWnd)->MDIGetActive()->GetActiveView());
float m_oldZoom=pImageLayer->m_Zoom;
pImageLayer->m_Zoom=(float)(nValue/100.0);
pImageLayer->AdjustZoomNav(m_oldZoom);
bEditChanged= FALSE;
}
}
void CNavigationDialog::OnCancel()
{
CMainFrame * pAppFrame = (CMainFrame*) AfxGetApp()->m_pMainWnd;
//退出全屏显示
if( pAppFrame->m_bFullScreenMode)
pAppFrame->FullScreenModeOff();
// CDialog::OnCancel();
}
void CNavigationDialog::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
if( bActiveView == FALSE)
{
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
return ;
}
CMYFUSIONView * pImageLayer = ((CMYFUSIONView *)((CMDIFrameWnd *)AfxGetApp()->
m_pMainWnd)->MDIGetActive()->GetActiveView());
int NowPos = m_NavigationCtrl.GetPos();
float m_oldZoom=pImageLayer->m_Zoom;
pImageLayer->m_Zoom=(float)pow(NowPos/25.0,2.0);
pImageLayer->AdjustZoomNav(m_oldZoom);
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CNavigationDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
if( bActiveView == FALSE)
{
CDialog::OnLButtonDown(nFlags, point);
return ;
}
if(RedRect==DisplayRect)
{
CDialog::OnLButtonDown(nFlags, point);
return ;
}
//Move smooth
if(RedRect.PtInRect(point))
{
SetCapture();
CursorStatus=NAVDLG_HAND_MOVE;
::SetCursor(m_HandMove);
ptOffRed.x = point.x - (RedRect.left + RedRect.right) / 2;
ptOffRed.y = point.y - (RedRect.top + RedRect.bottom) / 2;
}
//scroll to directly
else if(DisplayRect.PtInRect(point))
{
ptOffRed.x = 0;
ptOffRed.y = 0;
if(point.x - DisplayRect.left < (RedRect.Width() / 2))
ptOffRed.x = point.x - DisplayRect.left - (RedRect.Width() / 2) ;
if(point.x > DisplayRect.right - RedRect.Width() / 2)
ptOffRed.x = point.x - DisplayRect.right + RedRect.Width() / 2 ;
if(point.y - DisplayRect.top < (RedRect.Height() / 2))
ptOffRed.y = point.y - DisplayRect.top - (RedRect.Height() / 2) ;
if(point.y > DisplayRect.bottom - RedRect.Height() / 2)
ptOffRed.y = point.y - DisplayRect.bottom + RedRect.Height() / 2 ;
//move to the place first
CMYFUSIONView* pImageLayer = ((CMYFUSIONView *)((CMDIFrameWnd *)AfxGetApp()->
m_pMainWnd)->MDIGetActive()->GetActiveView());
CRect ViewClientRect;
pImageLayer->GetClientRect(&ViewClientRect);
CPoint NewScroll;
pImageLayer->ptDIBOff.x = (int)((double) (point.x-DisplayRect.left) / DisplayRect.Width() * DocSize.cx);
pImageLayer->ptDIBOff.y = (int)((double) (point.y-DisplayRect.top) / DisplayRect.Height() * DocSize.cy);
//置于中间
pImageLayer->ptDIBOff.x -= (int) ( (double)ViewClientRect.Width() / 2 / pImageLayer->m_Zoom + 0.5);
pImageLayer->ptDIBOff.y -= (int) ( (double)ViewClientRect.Height() / 2 / pImageLayer->m_Zoom + 0.5);
if((int)pImageLayer->Width - pImageLayer->ptDIBOff.x < (int) ( (double)ViewClientRect.Width() / pImageLayer->m_Zoom + 0.5))
pImageLayer->ptDIBOff.x = pImageLayer->Width - (int) ( (double)ViewClientRect.Width() / pImageLayer->m_Zoom + 0.5);
if((int)pImageLayer->Height - pImageLayer->ptDIBOff.y < (int) ( (double)ViewClientRect.Height() / pImageLayer->m_Zoom + 0.5))
pImageLayer->ptDIBOff.y = pImageLayer->Height - (int) ( (double)ViewClientRect.Height() / pImageLayer->m_Zoom + 0.5);
if(pImageLayer->ptDIBOff.x<0) pImageLayer->ptDIBOff.x=0;
if(pImageLayer->ptDIBOff.y<0) pImageLayer->ptDIBOff.y=0;
pImageLayer->SetScrollPos(SB_HORZ,(int)(pImageLayer->ptDIBOff.x*pImageLayer->m_Zoom+0.5),TRUE);
pImageLayer->SetScrollPos(SB_VERT,(int)(pImageLayer->ptDIBOff.y*pImageLayer->m_Zoom+0.5),TRUE);
PostMessage(WM_REDRAWDISPLAYRECT);
pImageLayer->bpbmpChanged=TRUE;
pImageLayer->PostMessage(WM_REDRAWVIEWRECT);
//second
SetCapture();
CursorStatus=NAVDLG_HAND_MOVE;
::SetCursor(m_HandMove);
}
CDialog::OnLButtonDown(nFlags, point);
}
void CNavigationDialog::OnMouseMove(UINT nFlags, CPoint point)
{
if( bActiveView == FALSE)
{
CDialog::OnMouseMove(nFlags, point);
return ;
}
if(RedRect==DisplayRect)
{
CDialog::OnMouseMove(nFlags, point);
return ;
}
if(CursorStatus==NAVDLG_HAND_MOVE)
{
if(nFlags && MK_LBUTTON)
{
::SetCursor(m_HandMove);
//move smoothly
CMYFUSIONView* pImageLayer = ((CMYFUSIONView *)((CMDIFrameWnd *)AfxGetApp()->
m_pMainWnd)->MDIGetActive()->GetActiveView());
CRect ViewClientRect;
pImageLayer->GetClientRect(&ViewClientRect);
CPoint NewScroll;
pImageLayer->ptDIBOff.x = (int)((double) (point.x - ptOffRed.x -DisplayRect.left) / DisplayRect.Width() * DocSize.cx);
pImageLayer->ptDIBOff.y = (int)((double) (point.y - ptOffRed.y -DisplayRect.top) / DisplayRect.Height() * DocSize.cy);
//置于中间
pImageLayer->ptDIBOff.x -= (int) ( (double)ViewClientRect.Width() / 2 / pImageLayer->m_Zoom + 0.5);
pImageLayer->ptDIBOff.y -= (int) ( (double)ViewClientRect.Height() / 2 / pImageLayer->m_Zoom + 0.5);
if((int)pImageLayer->Width - pImageLayer->ptDIBOff.x < (int) ( (double)ViewClientRect.Width() / pImageLayer->m_Zoom + 0.5))
pImageLayer->ptDIBOff.x = pImageLayer->Width - (int) ( (double)ViewClientRect.Width() / pImageLayer->m_Zoom + 0.5);
if((int)pImageLayer->Height - pImageLayer->ptDIBOff.y < (int) ( (double)ViewClientRect.Height() / pImageLayer->m_Zoom + 0.5))
pImageLayer->ptDIBOff.y = pImageLayer->Height - (int) ( (double)ViewClientRect.Height() / pImageLayer->m_Zoom + 0.5);
if(pImageLayer->ptDIBOff.x<0) pImageLayer->ptDIBOff.x=0;
if(pImageLayer->ptDIBOff.y<0) pImageLayer->ptDIBOff.y=0;
pImageLayer->SetScrollPos(SB_HORZ,(int)(pImageLayer->ptDIBOff.x*pImageLayer->m_Zoom+0.5),TRUE);
pImageLayer->SetScrollPos(SB_VERT,(int)(pImageLayer->ptDIBOff.y*pImageLayer->m_Zoom+0.5),TRUE);
PostMessage(WM_REDRAWDISPLAYRECT);
pImageLayer->bpbmpChanged=TRUE;
pImageLayer->PostMessage(WM_REDRAWVIEWRECT);
}
}
else
{
if(RedRect.PtInRect(point))
{
if(nFlags && MK_LBUTTON)
{
CursorStatus=NAVDLG_HAND_MOVE;
::SetCursor(m_HandMove);
}
else
{
CursorStatus=NAVDLG_HAND_CATCH;
::SetCursor(m_HandCatch);
}
}
else if(DisplayRect.PtInRect(point))
{
CursorStatus=NAVDLG_HAND_POINT;
::SetCursor(m_HandPoint);
}
else
{
CursorStatus=NAVDLG_DO_NOTHING;
CDialog::OnMouseMove(nFlags, point);
}
}
CDialog::OnMouseMove(nFlags, point);
}
void CNavigationDialog::OnLButtonUp(UINT nFlags, CPoint point)
{
if( bActiveView == FALSE)
{
CDialog::OnLButtonUp(nFlags, point);
return ;
}
if(CursorStatus==NAVDLG_HAND_MOVE)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -