📄 imagelabview.cpp
字号:
break;
default:
AfxMessageBox("请将颜色分辨率调到至少16位显示!!!");
return -1;
}
}
pScrnBMP = new CBitmap;
pScrnBMP->CreateCompatibleBitmap(pDC, MaxImageWidth, MaxImageHeight);
pScrnImageMemDC = new CDC;
pScrnImageMemDC->CreateCompatibleDC(pDC);
pScrnImageMemDC->SelectObject(pScrnBMP);
ReleaseDC(pDC);
}
return 0;
}
void CImageLABView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CImageLABDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rect, Wrect;
GetClientRect(&rect);
int ImgWidth, ImgHeight;
ScrollSize = CSize(MaxImageWidth, MaxImageHeight);
if(pDoc->Image.m_lpDibArray != NULL)
{
ImgWidth = int(pDoc->Image.m_ImageWidth * ShowScaleType[ShowScale] + 0.5);
ImgHeight = int(pDoc->Image.m_ImageHeight * ShowScaleType[ShowScale] + 0.5);
ImgWidth = ImgWidth<100? 100 : ImgWidth;
ImgHeight = ImgHeight<100? 100 : ImgHeight;
ScrollSize = CSize(ImgWidth, ImgHeight);
}
CSize sizePage(rect.Size());
if(ScrollSize.cx>32000||ScrollSize.cy>32000)
{
if(ScrollSize.cx<sizePage.cx)
sizePage.cx=ScrollSize.cx;
if(ScrollSize.cy<sizePage.cy)
sizePage.cy=ScrollSize.cy;
SCROLLINFO xInfo,yInfo;
xInfo.cbSize = sizeof(SCROLLINFO);
xInfo.fMask = SIF_ALL|SIF_DISABLENOSCROLL;
xInfo.nMin = 0;
xInfo.nMax = ScrollSize.cx-1;
xInfo.nPage = sizePage.cx;
xInfo.nPos = 0;
xInfo.nTrackPos = 0;
yInfo.cbSize = sizeof(SCROLLINFO);
yInfo.fMask = SIF_ALL|SIF_DISABLENOSCROLL;
yInfo.nMin = 0;
yInfo.nMax = ScrollSize.cy-1;
yInfo.nPage = sizePage.cy;
yInfo.nPos = 0;
yInfo.nTrackPos = 0;
SetScrollInfo(SB_HORZ,&xInfo);
SetScrollInfo(SB_VERT,&yInfo);
}
else
{
SetScrollSizes(MM_TEXT, ScrollSize);
}
CMainFrame *pMain = (CMainFrame *)AfxGetMainWnd();
pMain->GetClientRect(&Wrect);
if(ImgWidth < int(Wrect.Width()*0.8) && ImgHeight < int(Wrect.Height()*0.8))
ResizeParentToFit(FALSE);
if(pDoc->Image.m_lpDibArray == NULL)
ResizeParentToFit(FALSE);
ResizeParentToFit();
pDoc->SetPathName(LPCTSTR(pDoc->ImageFileName), false);
InvalidateRect(&rect, false); // 更新视类图像
pMain->m_wndMyDialogBar.Invalidate(); // 更新导游图中的图像
}
void CImageLABView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
if(ScrollOrgPt.x||ScrollOrgPt.y)
{
OldScrollOrgPt = ScrollOrgPt;
ScrollOrgPt = GetScrollPosition();
CRect clientRect;
GetClientRect(&clientRect);
CImageLABDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int cxDIB = (int)pDoc->Image.m_ImageWidth; // 图像的宽度
int cyDIB = (int)pDoc->Image.m_ImageHeight; // 图像的高度
if((clientRect.Width()<cxDIB || clientRect.Height()<cyDIB)&&CanManualMove)
{
MaxScrollRange.cx = (int)(cxDIB*ShowScaleType[ShowScale] + 0.5
- clientRect.Width());
MaxScrollRange.cy = (int)(cyDIB*ShowScaleType[ShowScale] + 0.5
- clientRect.Height());
}
}
CMainFrame *pMain = (CMainFrame *)AfxGetMainWnd();
pMain->m_wndMyDialogBar.DrawMiniImage();
CImageLABDoc* pDoc = GetDocument();
if(hcg200 != NULL && !bFreeze)
{
CG200Capture(hcg200, false);
ReSetDisplayPos();
CG200Capture(hcg200, true);
}
else if(bFreeze)
ReSetDisplayPos();
}
void CImageLABView::ReSetDisplayPos()
{
GetClientRect(&VideoRect);
//TRACE("Begin in ReSetDisplayPos VideoRect = (%d %d %d %d)\n", VideoRect.left, VideoRect.top, VideoRect.right, VideoRect.bottom);
MapWindowPoints(NULL, &VideoRect);
int dx , dy;
if( VideoRect.Width() && VideoRect.Height() )
{
//如果显示的尺寸大于 768*576 则将图像显示在客户区的中部
if(VideoRect.Width() >MaxImageWidth)
{
dx = (VideoRect.Width() - MaxImageWidth)/2;
VideoRect.left += dx;
VideoRect.right = VideoRect.left + MaxImageWidth;
}
if(VideoRect.Height() >MaxImageHeight)
{
dy = (VideoRect.Height() - MaxImageHeight)/2;
VideoRect.top += dy;
VideoRect.bottom = VideoRect.top + MaxImageHeight;
}
VideoRect.left = VideoRect.left/4*4 - 2;
VideoRect.right = VideoRect.right/4*4 - 2;
if( VideoRect.left < 2 )
{
VideoRect.right = (2 - VideoRect.left + VideoRect.right)/2*2;
VideoRect.left = 2;
}
if( hcg200 != NULL )
{
CG200SetInpVideoWindow(hcg200, (int)VideoStart.x, (int)VideoStart.y,
MaxImageWidth, MaxImageHeight);
CG200SetDispWindow(hcg200, VideoRect.left, VideoRect.top,
VideoRect.Width(), VideoRect.Height());
}
}
//TRACE("End in ReSetDisplayPos VideoRect = (%d %d %d %d)\n", VideoRect.left, VideoRect.top, VideoRect.right, VideoRect.bottom);
}
void CImageLABView::CG200Show(BOOL IsShow)
{
if(hcg200 != NULL)
{
CG200Capture(hcg200, IsShow);
}
}
void CImageLABView::PostNcDestroy()
{
if(hcg200 != NULL && !bFreeze)
{
CG200Capture(hcg200, false);
}
if(hcg200 != NULL) { EndCG200(hcg200); hcg200 = NULL; }
if(hinstDevice != NULL) { FreeLibrary( hinstDevice ); hinstDevice = NULL;}
SaveDesFile();
CImageLABApp::SorceType = 0;
CScrollView::PostNcDestroy();
}
BOOL CImageLABView::OnEraseBkgnd(CDC* pDC)
{
return false;
//return CScrollView::OnEraseBkgnd(pDC);
}
void CImageLABView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CPoint tmpPt;
GetCursorPos(&tmpPt);
switch(nChar)
{
case VK_UP:
SetCursorPos(tmpPt.x ,tmpPt.y - 1);
break;
case VK_DOWN:
SetCursorPos(tmpPt.x ,tmpPt.y + 1);
break;
case VK_LEFT:
SetCursorPos(tmpPt.x - 1 , tmpPt.y);
break;
case VK_RIGHT:
SetCursorPos(tmpPt.x + 1 , tmpPt.y);
break;
case VK_HOME:
OnVScroll(SB_TOP, 0, NULL);
OnHScroll(SB_LEFT, 0, NULL);
break;
case VK_END:
OnVScroll(SB_BOTTOM, 0, NULL);
OnHScroll(SB_RIGHT, 0, NULL);
break;
case VK_PRIOR:
OnVScroll(SB_PAGEUP, 0, NULL);
break;
case VK_NEXT:
OnVScroll(SB_PAGEDOWN, 0, NULL);
break;
case VK_RETURN:
{
DWORD lp;
CPoint pt = tmpPt + ScrollOrgPt;
lp = (WORD)pt.y;
lp = lp << 16;
lp = lp + (WORD)pt.x;
SendMessage(WM_LBUTTONDOWN, 0, lp);
SendMessage(WM_LBUTTONUP, 0, lp);
}
break;
case VK_SPACE:
SpaceKeyPressed=true;
break;
case VK_CONTROL:
CtrlKeyPressed=true;
break;
case VK_CAPITAL:
{
CapsKeyLocked^=1;
if(CapsKeyLocked)
::SetCursor( AfxGetApp()->LoadCursor(IDC_CURSOR_SELECTRECT));
else
::SetCursor( AfxGetApp()->LoadStandardCursor(IDC_ARROW));
break;
}
case VK_SHIFT:
ShiftKeyPressed = true;
break;
}
CScrollView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CImageLABView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch(nChar)
{
case VK_SPACE:
SpaceKeyPressed=false;
break;
case VK_CONTROL:
CtrlKeyPressed=false;
break;
case VK_SHIFT:
ShiftKeyPressed = false;
break;
}
CScrollView::OnKeyUp(nChar, nRepCnt, nFlags);
}
void CImageLABView::OnLButtonDown(UINT nFlags, CPoint point)
{
if (DashRectDrawed)
{
CPoint p0,p1;
p0 = SelectLTPt- ScrollOrgPt;
p1 = SelectRBPt- ScrollOrgPt;
CheckRect(p0,p1);
CRect dashRect(p0.x, p0.y, p1.x+3, p1.y+3);
InvalidateRect(dashRect, FALSE);
DashRectDrawed = FALSE;
ISLineSelected = FALSE;
}
if(CanManualMove && IsFreePan)
::SetCursor( AfxGetApp()->LoadCursor(IDC_HANDGRABED));
SelectLTPt = SelectRBPt = point + ScrollOrgPt;
IsLButtonDown = TRUE;
SetCapture();
CScrollView::OnLButtonDown(nFlags, point);
}
void CImageLABView::OnLButtonUp(UINT nFlags, CPoint point)
{
CImageLABDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(IsLButtonDown&&!IsFreePan)
{
CClientDC pdc(this);
pdc.SetROP2(R2_COPYPEN);
pOldPen = pdc.SelectObject(&dashRedPen);
CPoint lt=SelectLTPt-ScrollOrgPt;
CPoint rb=SelectRBPt-ScrollOrgPt;
if(abs(lt.x-rb.x)>5 || abs(lt.y-rb.y)>5)
{
if(IsShowLineGray)
{
pdc.MoveTo(lt);
pdc.LineTo(rb.x, rb.y);
}
else if(abs(lt.x-rb.x)>5 && abs(lt.y-rb.y)>5)
{
pdc.MoveTo(lt.x,lt.y);
pdc.LineTo(rb.x,lt.y);
pdc.LineTo(rb.x,rb.y);
pdc.LineTo(lt.x,rb.y);
pdc.LineTo(lt.x,lt.y);
}
}
else
{
CheckRect(lt,rb);
CRect dashRect(lt.x,lt.y,rb.x+1,rb.y+1);
DashRectDrawed = FALSE;
ISLineSelected = FALSE;
InvalidateRect(dashRect, FALSE);
}
pdc.SelectObject(pOldPen);
}
else if (IsLButtonDown&&IsFreePan)
{
CMainFrame *pMainFrame = (CMainFrame *)AfxGetMainWnd();
ASSERT_VALID(pMainFrame);
BOOL NoScroll = OldScrollOrgPt==ScrollOrgPt;
if(pMainFrame->m_wndMyDialogBar.BigImage)
{
pMainFrame->m_wndMyDialogBar.DrawMiniImage();
}
else
{
pMainFrame->m_wndMyDialogBar.Invalidate();
}
}
IsLButtonDown = false;
ReleaseCapture();
CScrollView::OnLButtonUp(nFlags, point);
}
void CImageLABView::OnMouseMove(UINT nFlags, CPoint point)
{
CRect cClientRect;
GetClientRect(cClientRect);
if (!cClientRect.PtInRect(point)&&!IsFreePan) MessageBeep(-1);
MousePt = point + ScrollOrgPt;
CClientDC pdc(this);
if (IsLButtonDown&&!IsFreePan)
{
CPoint tmpP,oldP;
pOldPen = pdc.SelectObject(&dashPen);
pdc.SelectStockObject(NULL_BRUSH);
pdc.SetROP2(R2_XORPEN);
if (DashRectDrawed)
{
oldP = SelectLTPt - ScrollOrgPt;
tmpP = SelectRBPt - ScrollOrgPt;
if(IsShowLineGray)
{
pdc.MoveTo(oldP);
pdc.LineTo(tmpP.x, tmpP.y);
}
else
{
CheckRect(oldP,tmpP);
pdc.Rectangle(oldP.x, oldP.y, tmpP.x+1, tmpP.y+1);
}
}
tmpP = point;
//如果space 按下的话,移动选择的矩形
if(SpaceKeyPressed)
{
CSize Offest = tmpP - SelectRBPt + ScrollOrgPt;
SelectLTPt +=Offest;
}
else if(CtrlKeyPressed)
{
CSize Offest = tmpP - SelectRBPt + ScrollOrgPt;
SelectLTPt -= Offest;
}
oldP = SelectLTPt - ScrollOrgPt;
if(IsShowLineGray)
{
if(ShiftKeyPressed&&!abs(oldP.x-tmpP.x)==0)
{
double slope =(double)(oldP.y-tmpP.y)/(double)(oldP.x-tmpP.x);
if(fabs(slope)<0.7)
{
tmpP.y = oldP.y;
}
else if (fabs(slope)>1.7)
{
tmpP.x = oldP.x;
}
else
{
if (fabs(slope)<1)
tmpP.y = tmpP.y>oldP.y?oldP.y + abs(tmpP.x - oldP.x): oldP.y - abs(tmpP.x - oldP.x);
else
tmpP.x = tmpP.x>oldP.x?oldP.x + abs(tmpP.y - oldP.y): oldP.x - abs(tmpP.y - oldP.y);
}
}
pdc.MoveTo(oldP);
pdc.LineTo(tmpP.x, tmpP.y);
SelectRBPt = tmpP + ScrollOrgPt;
ISLineSelected = TRUE;
}
else
{
SelectRBPt = tmpP + ScrollOrgPt;
CheckRect(oldP,tmpP);
pdc.Rectangle(oldP.x, oldP.y, tmpP.x+1, tmpP.y+1);
}
DashRectDrawed = TRUE;
pdc.SelectObject(pOldPen);
}
else if (IsLButtonDown&&IsFreePan)
{
int dx = (MousePt.x - SelectLTPt.x);
int dy = (MousePt.y - SelectLTPt.y);
ScrollOrgPt.x -= dx;
ScrollOrgPt.y -= dy;
if(ShowScale > FITSCALENUM)
{
int ImageSclae = int(ShowScaleType[ShowScale]);
ScrollOrgPt.x = (ScrollOrgPt.x+ ImageSclae- 1)/ImageSclae*ImageSclae;
ScrollOrgPt.y = (ScrollOrgPt.y+ ImageSclae- 1)/ImageSclae*ImageSclae;
}
if(ScrollOrgPt.x < 0 )
ScrollOrgPt.x = 0;
else if(ScrollOrgPt.x > MaxScrollRange.cx)
ScrollOrgPt.x = MaxScrollRange.cx;
if(ScrollOrgPt.y<0 ) ScrollOrgPt.y = 0;
else if(ScrollOrgPt.y > MaxScrollRange.cy)
ScrollOrgPt.y = MaxScrollRange.cy;
ScrollToPosition(ScrollOrgPt);
}
CScrollView::OnMouseMove(nFlags, point);
}
void CImageLABView::OnRButtonDown(UINT nFlags, CPoint point)
{
CImageLABDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
IsShowLineGray = IsFreePan = FALSE;
m_PopPoint = point + ScrollOrgPt;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -