📄 navigationdialog.cpp
字号:
// NavigationDialog.cpp : implementation file
//
#include "stdafx.h"
#include "MYFUSION.h"
#include "MainFrm.h"
#include "MYFUSIONDoc.h"
#include "MYFUSIONView.h"
#include "NavigationDialog.h"
#include "resource.h"
#include <math.h>
#include "BitMapDC.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/*
float SliderArray[]={0.2f,0.225f,0.25f,0.275f,0.3f,0.325f,0.35f,0.375f,
0.4f,0.425f,0.45f,0.475f,0.5f,0.525f,0.55f,0.575f,
0.6f,0.65f,0.7f,0.75f,0.8f,0.85f,0.9f,0.95f,
1.0f,1.05f,1.1f,1.15f,1.2f,1.25f,1.3f,1.35f,
1.4f,1.45f,1.5f,1.55f,1.6f,1.7f,1.8f,1.9f,
2.0f,2.5f,3.0f,3.5f,4.0f,4.5f,5.0f,5.5f,
6.0f,7.0f,8.0f,9.0f,10.0f,11.0f,12.0f,14.0f,
16.0f}; //57
*/
/////////////////////////////////////////////////////////////////////////////
// CNavigationDialog dialog
CNavigationDialog::CNavigationDialog(CWnd* pParent /*=NULL*/)
: CDialog(CNavigationDialog::IDD, pParent)
{
//{{AFX_DATA_INIT(CNavigationDialog)
m_scale_now = _T("");
//}}AFX_DATA_INIT
pbmp=NULL;
// pbmp->CGdiObject->m_hObject=NULL;
CursorStatus=NAVDLG_DO_NOTHING;
m_HandPoint = AfxGetApp()->LoadCursor(IDC_HAND_POINT);
m_HandMove = AfxGetApp()->LoadCursor(IDC_HAND_MOVE);
m_HandCatch = AfxGetApp()->LoadCursor(IDC_HAND_CATCH);
bActiveView = FALSE;
bEditChanged= FALSE;
}
CNavigationDialog::~CNavigationDialog()
{
if(pbmp!=NULL)
delete pbmp;
}
void CNavigationDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNavigationDialog)
DDX_Control(pDX, IDC_SCALE_EDIT, m_ZoomEdit);
DDX_Text(pDX, IDC_SCALE_EDIT, m_scale_now);
DDX_Control(pDX, IDC_NAVIGATION_SLIDER, m_NavigationCtrl);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNavigationDialog, CDialog)
ON_WM_CONTEXTMENU()
//{{AFX_MSG_MAP(CNavigationDialog)
ON_WM_HSCROLL()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_SETCURSOR()
ON_WM_LBUTTONUP()
ON_EN_CHANGE(IDC_SCALE_EDIT, OnChangeScaleEdit)
ON_WM_SIZE()
ON_COMMAND(ID_DEFAULT_SIZE, OnDefaultSize)
ON_COMMAND(ID_DEFAULT_LOCATION, OnDefaultLocation)
ON_COMMAND(ID_HIDE_NAVDLG, OnHideNavdlg)
ON_UPDATE_COMMAND_UI(ID_DEFAULT_SIZE, OnUpdateDefaultSize)
ON_UPDATE_COMMAND_UI(ID_DEFAULT_LOCATION, OnUpdateDefaultLocation)
ON_BN_CLICKED(IDC_NAV_ZOOMOUT, OnNavZoomout)
ON_BN_CLICKED(IDC_NAV_ZOOMIN, OnNavZoomin)
ON_BN_DOUBLECLICKED(IDC_NAV_ZOOMIN, OnDoubleclickedNavZoomin)
ON_BN_DOUBLECLICKED(IDC_NAV_ZOOMOUT, OnDoubleclickedNavZoomout)
ON_WM_DESTROY()
ON_WM_CLOSE()
ON_WM_PAINT()
ON_WM_KEYDOWN()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_REDRAWDISPLAYRECT,RedrawDisplayRect)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNavigationDialog message handlers
void CNavigationDialog::OnPaint()
{
CPaintDC dc(this);
CDC * pDC = GetDC();
CRect clientRect;
GetClientRect(&clientRect);
CRect clrect = clientRect;
//draw control
m_ZoomEdit.MoveWindow(3,clientRect.bottom-24,55,15,TRUE);
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);
pDC->MoveTo(clientRect.left+3,clientRect.bottom-30);
pDC->LineTo(clientRect.right-3,clientRect.bottom-30);
CMDIFrameWnd * pAppFrame = (CMDIFrameWnd *) AfxGetApp()->m_pMainWnd;
CMDIChildWnd * pChild=(CMDIChildWnd* )pAppFrame->MDIGetActive();
//当没有图象显示时,应该控制不显示
if(pChild == NULL)
{
bActiveView = FALSE;
m_scale_now = _T("");
m_ZoomEdit.EnableWindow(FALSE);
m_NavigationCtrl.EnableWindow (FALSE);
NavZoomOut.EnableWindow (FALSE);
NavZoomIn .EnableWindow (FALSE);
UpdateData(FALSE);
return;
}
CMYFUSIONView * pImageLayer = (CMYFUSIONView *)(pChild->GetActiveView());
if(pImageLayer == NULL) return;
CMYFUSIONDoc* pDoc=(CMYFUSIONDoc *)pImageLayer->GetDocument();
if(pDoc == NULL) return;
m_ZoomEdit.EnableWindow(TRUE);
m_NavigationCtrl.EnableWindow (TRUE);
//show rate
bActiveView = TRUE;
if(pImageLayer->m_Zoom <= 0.001f)
NavZoomOut.EnableWindow (FALSE);
else
NavZoomOut.EnableWindow (TRUE);
if(pImageLayer->m_Zoom >= 16.0f)
NavZoomIn .EnableWindow (FALSE);
else
NavZoomIn .EnableWindow (TRUE);
char buf[10];
sprintf(buf,"%.2f%s",pImageLayer->m_Zoom * 100.0,"%");
m_scale_now = buf;
int CurSlider=int(sqrt(pImageLayer->m_Zoom)*25.0+0.5);
//设置SLIDER
m_NavigationCtrl.SetPos(CurSlider);
UpdateData(FALSE);
//缩略图
HDIB hDIB = pDoc->m_hDIB;
if(hDIB==NULL) return;
DocSize=pDoc->m_sizeDoc;
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);
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();
if(pbmp!=NULL) delete pbmp;
CBitmapDC bitmapDC(DisplayRect.Width(), DisplayRect.Height(),pDC);
PaintDIB(bitmapDC.m_hDC, &rcDest, hDIB, &rcDIB, pDoc->m_palDIB );
pbmp=bitmapDC.Close();
DrawBitmap(pbmp, pDC, DisplayRect, CPoint(0,0));
//计算导航框
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::RedrawDisplayRect()
{
CDC * pDC = GetDC();
CRect clientRect;
GetClientRect(&clientRect);
CRect clrect = clientRect;
CMDIFrameWnd * pAppFrame = (CMDIFrameWnd *) AfxGetApp()->m_pMainWnd;
CMDIChildWnd * pChild=(CMDIChildWnd* )pAppFrame->MDIGetActive();
if(pChild == NULL)
{
if(bRedrawControl)
{
COLORREF bkColor=GetSysColor(COLOR_BTNFACE);
pDC->FillSolidRect(clientRect,bkColor);
//draw control
m_ZoomEdit.MoveWindow(3,clientRect.bottom-24,55,15,TRUE);
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;
}
bActiveView = FALSE;
m_scale_now = _T("");
m_ZoomEdit.EnableWindow(FALSE);
m_NavigationCtrl.EnableWindow (FALSE);
NavZoomOut.EnableWindow (FALSE);
NavZoomIn .EnableWindow (FALSE);
UpdateData(FALSE);
COLORREF bkColor=GetSysColor(COLOR_BTNFACE);
FillSolidRectUser( pDC, clientRect, CRect(0,0,0,0),bkColor);
pDC->MoveTo(clientRect.left+3,clientRect.bottom-30);
pDC->LineTo(clientRect.right-3,clientRect.bottom-30);
return;
}
CMYFUSIONView * pImageLayer = (CMYFUSIONView *)(pChild->GetActiveView());
if(pImageLayer == NULL) return;
CMYFUSIONDoc* pDoc=(CMYFUSIONDoc *)pImageLayer->GetDocument();
if(pDoc == NULL) return;
//show rate
//show rate
bActiveView = TRUE;
if(pImageLayer->m_Zoom <= 0.001f)
NavZoomOut.EnableWindow (FALSE);
else
NavZoomOut.EnableWindow (TRUE);
if(pImageLayer->m_Zoom >= 16.0f)
NavZoomIn .EnableWindow (FALSE);
else
NavZoomIn .EnableWindow (TRUE);
m_ZoomEdit.EnableWindow(TRUE);
m_NavigationCtrl.EnableWindow (TRUE);
pDC->MoveTo(clientRect.left+3,clientRect.bottom-30);
pDC->LineTo(clientRect.right-3,clientRect.bottom-30);
char buf[10];
sprintf(buf,"%.2f%s",pImageLayer->m_Zoom * 100.0,"%");
m_scale_now = buf;
int CurSlider=int(sqrt(pImageLayer->m_Zoom)*25.0+0.5);
//设置SLIDER
m_NavigationCtrl.SetPos(CurSlider);
UpdateData(FALSE);
if(bpbmpChanged)
{
if(bRedrawControl)
{
//draw control
m_ZoomEdit.MoveWindow(3,clientRect.bottom-24,55,15,TRUE);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -