www.pudn.com > 医学图像处理示例源代码.rar > ImageLABView.cpp
// ImageLABView.cpp : implementation of the CImageLABView class // #include "stdafx.h" #include "ImageLAB.h" #include "AllImage.h" #include "ImageLABDoc.h" #include "ImageLABView.h" #include "ChildFrm.h" #include "resource.h" #include "CommonProc.h" #include "MainFrm.h" #include "UseDlgs.h" #include "MEMALLOC.H" #include "InputImg.h" //#include "Cg200p32.h" #include#include #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #define MAXSCALENUM 12 #define FITSCALENUM 5 double ShowScaleType[] = {0.03, 0.2, 0.3, 0.5, 0.7, 1, 2, 3, 5, 10, 20, 30}; int CImageLABView::NowPinNo = -1; CPoint CImageLABView::ScrollOrgPt; HCG200 CImageLABView::hcg200 = NULL; HINSTANCE CImageLABView::hinstDevice = NULL; CPoint CImageLABView::m_PinImagePos[MAXPINNUM]; CString CImageLABView::m_Hospital="湖南省武警总队医院"; ///////////////////////////////////////////////////////////////////////////// // CImageLABView IMPLEMENT_DYNCREATE(CImageLABView, CScrollView) BEGIN_MESSAGE_MAP(CImageLABView, CScrollView) ON_WM_CONTEXTMENU() //{{AFX_MSG_MAP(CImageLABView) ON_WM_KEYDOWN() ON_WM_KEYUP() ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() ON_WM_MOUSEMOVE() ON_WM_RBUTTONDOWN() ON_WM_RBUTTONUP() ON_COMMAND(ID_FITIMAGE, OnFitimage) ON_UPDATE_COMMAND_UI(ID_FITIMAGE, OnUpdateFitimage) ON_COMMAND(ID_ZOOMIN, OnZoomin) ON_UPDATE_COMMAND_UI(ID_ZOOMIN, OnUpdateZoomin) ON_COMMAND(ID_ZOOMOUT, OnZoomout) ON_UPDATE_COMMAND_UI(ID_ZOOMOUT, OnUpdateZoomout) ON_WM_CREATE() ON_WM_SIZE() ON_COMMAND(ID_IMAGE_SHOWLINEGRAYINFO, OnImageShowlinegrayinfo) ON_WM_SETCURSOR() ON_UPDATE_COMMAND_UI(ID_INDICATOR_IMAGEPIXELS, OnUpdateIndicatorImagepixels) ON_UPDATE_COMMAND_UI(ID_INDICATOR_IMAGESCALE, OnUpdateIndicatorImagescale) ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_WM_ERASEBKGND() ON_COMMAND(ID_FREEPAN, OnFreepan) ON_UPDATE_COMMAND_UI(ID_FREEPAN, OnUpdateFreepan) ON_UPDATE_COMMAND_UI(ID_IMAGE_SHOWLINEGRAYINFO, OnUpdateImageShowlinegrayinfo) ON_COMMAND(ID_CAPTURE_CCD, OnCaptureCcd) ON_UPDATE_COMMAND_UI(ID_CAPTURE_CCD, OnUpdateCaptureCcd) ON_COMMAND(ID_SHOWPIN, OnShowpin) ON_UPDATE_COMMAND_UI(ID_SHOWPIN, OnUpdateShowpin) ON_COMMAND(ID_PIN_ADD, OnPinAdd) ON_UPDATE_COMMAND_UI(ID_PIN_ADD, OnUpdatePinAdd) ON_COMMAND(ID_PIN_DEL, OnPinDel) ON_UPDATE_COMMAND_UI(ID_PIN_DEL, OnUpdatePinDel) ON_COMMAND(ID_PIN_CHANGICON, OnPinChangicon) ON_UPDATE_COMMAND_UI(ID_PIN_CHANGICON, OnUpdatePinChangicon) ON_COMMAND(ID_DESCRIBE, OnDescribe) ON_COMMAND(ID_CHANGECHANNEL, OnChangechannel) ON_UPDATE_COMMAND_UI(ID_CHANGECHANNEL, OnUpdateChangechannel) ON_COMMAND(ID_PATRIMAGESAVE, OnPatrimagesave) ON_UPDATE_COMMAND_UI(ID_PATRIMAGESAVE, OnUpdatePatrimagesave) ON_COMMAND(ID_FILE_PRINT_MYSETTING, OnFilePrintMysetting) ON_UPDATE_COMMAND_UI(ID_FILE_PRINT_MYSETTING, OnUpdateFilePrintMysetting) ON_COMMAND(ID_PATRIMAGE_CROP, OnPatrimageCrop) ON_UPDATE_COMMAND_UI(ID_PATRIMAGE_CROP, OnUpdatePatrimageCrop) ON_WM_TIMER() ON_COMMAND(ID_PrintNumber, OnPrintNumber) //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CImageLABView construction/destruction CImageLABView::CImageLABView() { DashRectDrawed = IsLButtonDown = false; SpaceKeyPressed = CtrlKeyPressed = false; IsShowLineGray = ISLineSelected = false; ShiftKeyPressed = IsSlideShowImage = false; CanManualMove = IsFreePan = false; IsDesTxtChanged = false; CG200_FLAG = 0; hinstDevice = LoadLibrary( "cg200d32.dll"); // hcg200 = BeginCG200(1); // CG200_FLAG = CG200CheckPassword(hcg200); /* if(!CG200_FLAG) { AfxMessageBox("非法使用该软件, 请与供货商联系!!!"); return; }//*/ MousePt = ScrollOrgPt = CPoint(0,0); MaxScrollRange = CSize(0, 0); CapsKeyLocked = ::GetKeyState(VK_CAPITAL)&1; ShowScale = FITSCALENUM; fShowScale = ShowScaleType[ShowScale]; pSB = ( CStatusBar*)AfxGetApp()->m_pMainWnd-> GetDescendantWindow(AFX_IDW_STATUS_BAR); m_dwMinTime = 10; // Minimum delay time in milliseconds m_nPageSlices = 12; // Number of scroll subdivisions per page m_nLineSlices = 4; // Number of scroll subdivisions per line dashPen.CreatePen(PS_DOT,1,RGB(0, 0, 0)); dashRedPen.CreatePen(PS_DOT,1,RGB(255, 0, 0)); IsPinVisible = false; // from CG200 VideoStart = CPoint(0, 0); pScrnBMP = NULL; pScrnImageMemDC = NULL; bFreeze = true; IsScrnImageMemDCOK = false; CG200Channel = 0; // for pin m_OtherDesStore = ""; m_DesDate = "诊断文件不存在, 没有时间"; lpDesStr = NULL; PinNum = 0; for(int i= 0; i< MAXPINNUM; i++) { m_Pin[i] = NULL; m_PinPos[i] = m_PinImagePos[i] = CPoint(100, 100); m_pinIconNO[i] = IDI_ICON1; } } CImageLABView::~CImageLABView() { tempDC.DeleteDC(); if(pScrnBMP != NULL) { delete pScrnBMP; pScrnBMP = NULL; } if(pScrnImageMemDC != NULL) { delete pScrnImageMemDC; pScrnImageMemDC= NULL;} if( lpDesStr != NULL ) delete []lpDesStr; for(int i= 0; i< MAXPINNUM; i++) if( m_Pin[i] != NULL) delete m_Pin[i]; } BOOL CImageLABView::PreCreateWindow(CREATESTRUCT& cs) { if( hcg200 == 0x0ffffffff ) { TRACE("Failed to check Password\n"); return FALSE; } return CScrollView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CImageLABView drawing void CImageLABView::DrawDIB(CDC *pDC) { CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); //获得当前窗口在滚动视窗的坐标 int xPos = GetScrollPos(SB_HORZ); int yPos = GetScrollPos(SB_VERT); int cxDIB = (int)pDoc->Image.m_ImageWidth; // Size of DIB - x int cyDIB = (int)pDoc->Image.m_ImageHeight; // Size of DIB - y GetClientRect(&clientRect); int width = clientRect.Width(); //width height of Client Range int height = clientRect.Height(); int xShowLT, yShowLT, xShowRB, yShowRB; //Externed View Window { xShowLT = xPos; yShowLT = yPos; xShowRB = xPos + width; yShowRB = yPos + height; } int xStartDIB = (int)(xShowLT / ShowScaleType[ShowScale] + 0.5); // Need Start of DIB int yStartDIB = (int)(yShowLT / ShowScaleType[ShowScale] + 0.5); int xEndDIB = (int)(xShowRB / ShowScaleType[ShowScale] + 0.5); // Need Start of DIB int yEndDIB = (int)(yShowRB / ShowScaleType[ShowScale] + 0.5); if(xEndDIB > cxDIB) { xEndDIB = cxDIB; xShowRB = (int)(cxDIB*ShowScaleType[ShowScale] + 0.5); xShowLT = xShowRB - width; } if(yEndDIB > cyDIB) { yEndDIB = cyDIB; yShowRB = (int)(cyDIB*ShowScaleType[ShowScale] + 0.5); yShowLT = yShowRB - height; } //CRect rcDIB(xStartDIB, yStartDIB, xEndDIB, yEndDIB); if (!pDC->IsPrinting()) // printer DC { CPoint p1(xStartDIB, yStartDIB); CPoint p2(xEndDIB, yEndDIB); pDoc->Image.CheckPoint(p1); pDoc->Image.CheckPoint(p2); BOOL IsCreateBmpSuccess; IsCreateBmpSuccess = bitmap.CreateCompatibleBitmap(pDC, width , height); pOldbmp = tempDC.SelectObject(&bitmap); if(!pDoc->Image.ShowPartialImage(&tempDC, clientRect, p1, p2, ShowScale == 5)) { TRACE("pDoc->Image.ShowPartialImage() = false\n"); L_TraceRect("clientRect", clientRect); L_TraceRect("ImageRect", CRect(p1,p2)); TRACE("The error is %d\n",GetLastError()); } OnPrepareDC(pDC); if(!pDC->StretchBlt(xPos, yPos, clientRect.Width(), clientRect.Height(), &tempDC, 0, 0, clientRect.Width(), clientRect.Height(), SRCCOPY)) TRACE("pDC->StretchBlt() = false\n"); tempDC.SelectObject(pOldbmp); if(IsCreateBmpSuccess) { ASSERT(bitmap.DeleteObject()); } else TRACE("IsCreateBmpSuccess = false\n"); } } void CImageLABView::OnDraw(CDC* pDC) { if(!bFreeze) return; CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); int w = int(pDoc->Image.m_ImageWidth * ShowScaleType[ShowScale]); int h = int(pDoc->Image.m_ImageHeight* ShowScaleType[ShowScale]); CRect ViewRect, showrect = CRect(0, 0, w, h); GetClientRect(&ViewRect); //是否能进行鼠标漫游显示 CanManualMove = (ViewRect.Width() Image.SetShowScale(ShowScaleType[ShowScale]); pDoc->Image.ShowCurrentImage(pDC, showrect); } else { DrawDIB(pDC); } if(DashRectDrawed) { pDC->SetROP2(R2_COPYPEN); CPen dashPen(PS_DOT,1,RGB(255,0,0)); pOldPen = pDC->SelectObject(&dashPen); CPoint lt = SelectLTPt; CPoint rb = SelectRBPt; if(IsShowLineGray) { pDC->MoveTo(lt); pDC->LineTo(rb); } else { 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); } pDC->SelectObject(pOldPen); } } void CImageLABView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); ReadDesFile(); CString tip; for(int i= 0; i< PinNum; i++) { if(i<9) tip.Format("NO.%1d", i+1); else tip.Format("NO.%2d", i+1); CPoint p = m_PinImagePos[i]; double Scale = ShowScaleType[ShowScale]; m_PinPos[i].x = int( Scale * m_PinImagePos[i].x ); m_PinPos[i].y = int( Scale * m_PinImagePos[i].y ); if( m_Pin[i] != NULL ) delete m_Pin[i]; m_Pin[i] = new CMapPin(); VERIFY(m_Pin[i]->SetIcon(AfxGetResourceHandle(), m_pinIconNO[i], TRUE)); VERIFY(m_Pin[i]->Create(tip, WS_VISIBLE | WS_CHILD, p, this, 0xFFFF)); m_Pin[i]->SetPopupMenu(CG_IDR_POPUP_IMAGE_LABVIEW); m_Pin[i]->SetAllowDrag(false); m_Pin[i]->m_PinPos = m_PinPos[i]; m_Pin[i]->m_NO = i; } CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CClientDC dc(this); tempDC.CreateCompatibleDC(&dc); ScrollSize = CSize(MaxImageWidth, MaxImageHeight); if(pDoc->Image.m_lpDibArray != NULL) { int cxDIB = (int)pDoc->Image.m_ImageWidth; int cyDIB = (int)pDoc->Image.m_ImageHeight; int w = int(cxDIB*ShowScaleType[ShowScale]); int h = int(cyDIB*ShowScaleType[ShowScale]); ImageOffset = (0, 0); ScrollSize = CSize(w, h); if(ScrollSize.cx>32000||ScrollSize.cy>32000) { SCROLLINFO xInfo,yInfo; xInfo.cbSize=sizeof(SCROLLINFO); xInfo.fMask=SIF_ALL|SIF_DISABLENOSCROLL; xInfo.nMin=0; xInfo.nMax=ScrollSize.cx-1; xInfo.nPage= 100; 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=100; yInfo.nPos=0; yInfo.nTrackPos=0; SetScrollInfo(SB_HORZ,&xInfo); SetScrollInfo(SB_VERT,&yInfo); } else { SetScrollSizes(MM_TEXT, ScrollSize); } } else { SetScrollSizes(MM_TEXT, ScrollSize); ResizeParentToFit(); } } ///////////////////////////////////////////////////////////////////////////// // CImageLABView printing BOOL CImageLABView::OnPreparePrinting(CPrintInfo* pInfo) { // default preparation return DoPreparePrinting(pInfo); } void CImageLABView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add extra initialization before printing } void CImageLABView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: add cleanup after printing } ///////////////////////////////////////////////////////////////////////////// // CImageLABView diagnostics #ifdef _DEBUG void CImageLABView::AssertValid() const { CScrollView::AssertValid(); } void CImageLABView::Dump(CDumpContext& dc) const { CScrollView::Dump(dc); } CImageLABDoc* CImageLABView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CImageLABDoc))); return (CImageLABDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CImageLABView message handlers int CImageLABView::OnCreate(LPCREATESTRUCT lpCreateStruct) { CTime tmpTime = CTime::GetCurrentTime(); int year = tmpTime.GetYear(); int month = tmpTime.GetMonth(); int day = tmpTime.GetDay(); if (CScrollView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: Add your specialized creation code here CImageLABDoc* pDoc = GetDocument(); pDoc->m_pView = this; /* if( !(year == 2000 && (month == 4 || month == 5))) { AfxMessageBox("对不起,使用期限已过!"); return -1; } //*/ if(CImageLABApp::SorceType == 1) { hinstDevice = LoadLibrary("cg200d32.dll"); hcg200 = BeginCG200(1); /* if(!CG200_FLAG) { AfxMessageBox("非法使用该软件, 请与供货商联系!!!"); return -1; } */ CDC* pDC = GetDC(); if(hcg200 != NULL) { int depth = pDC->GetDeviceCaps(BITSPIXEL); switch(depth) { case 16: CG200SetColorSpace(hcg200, RGB565); break; case 24: CG200SetColorSpace(hcg200, RGB888); 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 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() 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; CScrollView::OnRButtonDown(nFlags, point); } void CImageLABView::OnRButtonUp(UINT nFlags, CPoint point) { //CImageLABDoc* pDoc = GetDocument(); //ASSERT_VALID(pDoc); CScrollView::OnRButtonUp(nFlags, point); } BOOL CImageLABView::OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll) { MousePt -= ScrollOrgPt; OldScrollOrgPt = ScrollOrgPt; ScrollOrgPt = GetScrollPosition(); MousePt += ScrollOrgPt; CMainFrame *pMainFrame = (CMainFrame *)AfxGetMainWnd(); ASSERT_VALID(pMainFrame); BOOL NoScroll = OldScrollOrgPt==ScrollOrgPt; if(!NoScroll) { if(pMainFrame->m_wndMyDialogBar.BigImage) { pMainFrame->m_wndMyDialogBar.DrawMiniImage(); } else { pMainFrame->m_wndMyDialogBar.Invalidate(); } } BYTE nCode = LOBYTE (nScrollCode); if ((nCode == SB_PAGELEFT) || (nCode == SB_PAGERIGHT) || (nCode == SB_LINELEFT) || (nCode == SB_LINERIGHT)) { int nCount, nInc, nFinalInc, nLineCode; switch (nCode) { case SB_PAGELEFT: nLineCode = SB_LINELEFT; nInc = m_pageDev.cx / m_nPageSlices; nFinalInc = m_pageDev.cx % m_nPageSlices; nCount = m_nPageSlices; break; case SB_PAGERIGHT: nLineCode = SB_LINERIGHT; nInc = m_pageDev.cx / m_nPageSlices; nFinalInc = m_pageDev.cx % m_nPageSlices; nCount = m_nPageSlices; break; case SB_LINELEFT: nLineCode = SB_LINELEFT; nInc = m_lineDev.cx / m_nLineSlices; nFinalInc = m_lineDev.cx % m_nLineSlices; nCount = m_nLineSlices; break; case SB_LINERIGHT: nLineCode = SB_LINERIGHT; nInc = m_lineDev.cx / m_nLineSlices; nFinalInc = m_lineDev.cx % m_nLineSlices; nCount = m_nLineSlices; break; } int nOldLineSize = m_lineDev.cx; BOOL bResult = FALSE; DWORD dwTime = 0; while (nCount--) { DWORD dwCurrentTime = ::GetCurrentTime (); DWORD dwElapsedTime = dwCurrentTime - dwTime; if (dwElapsedTime < m_dwMinTime) ::Sleep (m_dwMinTime - dwElapsedTime); dwTime = dwCurrentTime; m_lineDev.cx = nInc; BOOL bScrolled = CScrollView::OnScroll (MAKEWORD (nLineCode, -1), nPos); m_lineDev.cx = nOldLineSize; if (!bScrolled) return bResult; bResult = TRUE; } if (nFinalInc) { m_lineDev.cx = nFinalInc; if (!CScrollView::OnScroll (MAKEWORD (nLineCode, -1), nPos)) bResult = TRUE; m_lineDev.cx = nOldLineSize; } return bResult; } // Next handle up/down scroll messages. If scrolling by page, // scroll m_nPageSlices times rather than 1. If scrolling by line, // scroll m_nLineSlices times. nCode = HIBYTE (nScrollCode); if ((nCode == SB_PAGEUP) || (nCode == SB_PAGEDOWN) || (nCode == SB_LINEUP) || (nCode == SB_LINEDOWN)) { int nCount, nInc, nFinalInc, nLineCode; switch (nCode) { case SB_PAGEUP: nLineCode = SB_LINEUP; nInc = m_pageDev.cy / m_nPageSlices; nFinalInc = m_pageDev.cy % m_nPageSlices; nCount = m_nPageSlices; break; case SB_PAGEDOWN: nLineCode = SB_LINEDOWN; nInc = m_pageDev.cy / m_nPageSlices; nFinalInc = m_pageDev.cy % m_nPageSlices; nCount = m_nPageSlices; break; case SB_LINEUP: nLineCode = SB_LINEUP; nInc = m_lineDev.cy / m_nLineSlices; nFinalInc = m_lineDev.cy % m_nLineSlices; nCount = m_nLineSlices; break; case SB_LINEDOWN: nLineCode = SB_LINEDOWN; nInc = m_lineDev.cy / m_nLineSlices; nFinalInc = m_lineDev.cy % m_nLineSlices; nCount = m_nLineSlices; break; } int nOldLineSize = m_lineDev.cy; BOOL bResult = FALSE; DWORD dwTime = 0; while (nCount--) { DWORD dwCurrentTime = ::GetCurrentTime (); DWORD dwElapsedTime = dwCurrentTime - dwTime; if (dwElapsedTime < m_dwMinTime) ::Sleep (m_dwMinTime - dwElapsedTime); dwTime = dwCurrentTime; m_lineDev.cy = nInc; BOOL bScrolled = CScrollView::OnScroll (MAKEWORD (-1, nLineCode), nPos); m_lineDev.cy = nOldLineSize; if (!bScrolled) return bResult; bResult = TRUE; } if (nFinalInc) { m_lineDev.cy = nFinalInc; if (!CScrollView::OnScroll (MAKEWORD (-1, nLineCode), nPos)) bResult = TRUE; m_lineDev.cy = nOldLineSize; } return bResult; }//*/ return CScrollView::OnScroll(nScrollCode, nPos, bDoScroll); } void CImageLABView::CheckRect(CPoint &p1,CPoint &p2) { P_LONG tempx,tempy,temp; tempx=p2.x - p1.x; tempy=p2.y - p1.y; if(tempx<0) { temp=p1.x; p1.x=p2.x; p2.x=temp; } if(tempy<0) { temp=p1.y; p1.y=p2.y; p2.y=temp; } } void CImageLABView::OnContextMenu(CWnd*, CPoint point) { // CG: This block was added by the Pop-up Menu component { if (point.x == -1 && point.y == -1) { //keystroke invocation CRect rect; GetClientRect(rect); ClientToScreen(rect); point = rect.TopLeft(); point.Offset(5, 5); } CMenu menu; VERIFY(menu.LoadMenu(CG_IDR_POPUP_IMAGE_LABVIEW)); CMenu* pPopup = menu.GetSubMenu(0); ASSERT(pPopup != NULL); CWnd* pWndPopupOwner = this; while (pWndPopupOwner->GetStyle() & WS_CHILD) pWndPopupOwner = pWndPopupOwner->GetParent(); pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, pWndPopupOwner); } } void CImageLABView::OnFitimage() { ShowScale = FITSCALENUM; fShowScale = ShowScaleType[ShowScale]; DashRectDrawed = FALSE; OnUpdate(this,NULL,NULL); ScrollOrgPt = GetScrollPosition(); for(int i= 0; i< MAXPINNUM; i++) { if( m_Pin[i] != NULL ) { m_PinPos[i].x = m_PinImagePos[i].x; m_PinPos[i].y = m_PinImagePos[i].y; m_Pin[i]->MoveToPt(m_PinPos[i]); } } } void CImageLABView::OnUpdateFitimage(CCmdUI* pCmdUI) { pCmdUI->Enable(ShowScale != FITSCALENUM); } void CImageLABView::OnZoomin() { ShowScale++; fShowScale = ShowScaleType[ShowScale]; DashRectDrawed = FALSE; OnUpdate(this,NULL,NULL); ScrollOrgPt = GetScrollPosition(); for(int i= 0; i< MAXPINNUM; i++) { if( m_Pin[i] != NULL ) { m_PinPos[i].x = int( fShowScale * m_PinImagePos[i].x ); m_PinPos[i].y = int( fShowScale * m_PinImagePos[i].y ); m_Pin[i]->MoveToPt(m_PinPos[i]); } } } void CImageLABView::OnUpdateZoomin(CCmdUI* pCmdUI) { pCmdUI->Enable(ShowScale MoveToPt(m_PinPos[i]); } } } void CImageLABView::OnUpdateZoomout(CCmdUI* pCmdUI) { pCmdUI->Enable(ShowScale>0); } void CImageLABView::OnImageShowlinegrayinfo() { IsShowLineGray = TRUE; if(DashRectDrawed && !ISLineSelected) { CPoint p0 = SelectLTPt- ScrollOrgPt; CPoint p1 = SelectRBPt- ScrollOrgPt; CheckRect(p0, p1); CRect dashRect(p0.x, p0.y, p1.x+ 1, p1.y+ 1); InvalidateRect(dashRect, FALSE); DashRectDrawed = FALSE; }//*/ if(ISLineSelected) { CPoint p0, p1; GetSelectArea(p0, p1); CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CLineGrayInfoDlg dlg(GetDocument(), p0, p1); dlg.DoModal(); ISLineSelected = IsShowLineGray = DashRectDrawed = FALSE; p0 = SelectLTPt - ScrollOrgPt; p1 = SelectRBPt - ScrollOrgPt; CheckRect(p0, p1); CRect dashRect(p0.x-1,p0.y-1,p1.x+2,p1.y+2); InvalidateRect(dashRect, FALSE); } } void CImageLABView::OnUpdateImageShowlinegrayinfo(CCmdUI* pCmdUI) { pCmdUI->SetText(ISLineSelected ? "线灰度显示" : "线灰度显示选点"); } BOOL CImageLABView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { if(nHitTest == HTCLIENT) { if(IsShowLineGray) ::SetCursor( AfxGetApp()->LoadCursor(IDC_CURSOR_SELECTLINE)); else if(!IsFreePan) { if(CapsKeyLocked) ::SetCursor( AfxGetApp()->LoadCursor(IDC_CURSOR_SELECTRECT)); else ::SetCursor( AfxGetApp()->LoadStandardCursor(IDC_ARROW)); } else if(CanManualMove && IsFreePan) { if(IsLButtonDown) ::SetCursor( AfxGetApp()->LoadCursor(IDC_HANDGRABED)); else ::SetCursor( AfxGetApp()->LoadCursor(IDC_HANDWANTGRAB)); } return true; } return CScrollView::OnSetCursor(pWnd, nHitTest, message); } void CImageLABView::OnUpdateIndicatorImagepixels(CCmdUI* pCmdUI) { CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); double fPx = MousePt.x/ ShowScaleType[ShowScale]; double fPy = MousePt.y/ ShowScaleType[ShowScale]; int ClientW = int( pDoc->Image.m_ImageWidth * ShowScaleType[ShowScale] ); long px = long( fPx + 0.5); long py = long( fPy + 0.5); if(pDoc->Image.CheckPoint(px, py) && pDoc->Image.m_lpDibArray != NULL) { RGBTRIPLE temp = pDoc->Image.GetRGBPixel(px, py); CString msg; msg.Format("鼠标位置:(%7.2f, %7.2f) RGB=(%3d,%3d,%3d)\n",fPx, fPy, temp.rgbtRed, temp.rgbtGreen, temp.rgbtBlue); pCmdUI->SetText(msg); if(ClientW < 500) pSB->SetPaneText(0,msg); } } void CImageLABView::OnUpdateIndicatorImagescale(CCmdUI* pCmdUI) { CString strscale; strscale.Format("显示比例:%d%%",int(ShowScaleType[ShowScale]*100)); pCmdUI->SetText(strscale); } void CImageLABView::OnEditCopy() { CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (OpenClipboard()) { BeginWaitCursor(); EmptyClipboard(); CPoint p0,p1; if(DashRectDrawed) { GetSelectArea(p0,p1); } else { p0 = CPoint(0,0); p1 = CPoint(pDoc->Image.m_ImageWidth-1,pDoc->Image.m_ImageHeight-1); } HANDLE h_Dib = pDoc->Image.GetCopyHandle(p0, p1); SetClipboardData(CF_DIB, CopyHandle(h_Dib)); CloseClipboard(); pDoc->Image.ReleaseCopyHandle(); EndWaitCursor(); } } BOOL CImageLABView::GetSelectArea(CPoint &p1, CPoint &p2) { CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CPoint tempPT1(0, 0), tempPT2(0, 0); int w = int(pDoc->Image.m_ImageWidth*ShowScaleType[ShowScale]); int h = int(pDoc->Image.m_ImageHeight*ShowScaleType[ShowScale]); CRect ViewRect; GetClientRect(&ViewRect); if(ViewRect.Width()>w) { tempPT1.x -= (ViewRect.Width()-w)/2; tempPT2.x -= (ViewRect.Width()-w)/2; } if(ViewRect.Height()>h) { tempPT1.y -= (ViewRect.Height()-h)/2; tempPT2.y -= (ViewRect.Height()-h)/2; } tempPT1.x = int((double)SelectLTPt.x /ShowScaleType[ShowScale] + 0.5); tempPT1.y = int((double)SelectLTPt.y /ShowScaleType[ShowScale] + 0.5); tempPT2.x = int((double)SelectRBPt.x /ShowScaleType[ShowScale] + 0.5); tempPT2.y = int((double)SelectRBPt.y /ShowScaleType[ShowScale] + 0.5); pDoc->Image.CheckPoint(tempPT1); pDoc->Image.CheckPoint(tempPT2); pDoc->Image.CheckRect(tempPT1, tempPT2); p1 = tempPT1; p2 = tempPT2; return TRUE; } void CImageLABView::OnActivateView(BOOL bActivate, CView* pActivateView, CView* pDeactiveView) { CMainFrame *pMain = (CMainFrame *)AfxGetMainWnd(); pMain->m_wndMyDialogBar.Invalidate(); CImageLABDoc* pDoc = GetDocument(); if( pDoc->Image.m_SorceType ) CImageLABApp::SorceType = pDoc->Image.m_SorceType; if(!bFreeze && hcg200 != NULL) { if( !bActivate ) { CG200Capture(hcg200, false); } else { CG200Capture(hcg200, true); } } CScrollView::OnActivateView(bActivate, pActivateView, pDeactiveView); } void CImageLABView::OnFreepan() { IsFreePan ^= 1; } void CImageLABView::OnUpdateFreepan(CCmdUI* pCmdUI) { pCmdUI->Enable(CanManualMove); if(CanManualMove) pCmdUI->SetCheck(IsFreePan); else pCmdUI->SetCheck(false); } void CImageLABView::OnCaptureCcd() { if(hcg200 == NULL) return; CImageLABDoc* pDoc = GetDocument(); if(bFreeze) { CG200Capture(hcg200, true); bFreeze = false; IsScrnImageMemDCOK = false; pDoc->SetModifiedFlag(false); } else { int ImageW = pDoc->Image.m_ImageWidth; int ImageH = pDoc->Image.m_ImageHeight; int LineL = ImageW* 3; BYTE *lpNowImage = new BYTE[ImageW* LineL]; CG200Capture(hcg200, false); bFreeze = true; //采集图像 DWORD dwPage, PhysMemAddr, MemHandle, LineAddr; StaticMemAlloc(&dwPage, &PhysMemAddr, &MemHandle, &LineAddr); char *lpSourceBuf = (char *)LineAddr; CG200SetDispWindow(hcg200, VideoRect.left, VideoRect.top, ImageW, ImageH); CG200CaptureToMem(hcg200, PhysMemAddr, dwPage*4*1024, 2, FRAME, 1); CG200ReadFromMem( hcg200, lpSourceBuf, dwPage*4*1024, 0, (char *)lpNowImage); CG200SetDispWindow(hcg200, VideoRect.left, VideoRect.top, VideoRect.Width(), VideoRect.Height()); BYTE *lpTemp = lpNowImage; for(int j= ImageH - 1; j >=0 ; j--, lpTemp += LineL) { memcpy(pDoc->Image.RowAddress[j], lpTemp, LineL); } pDoc->SetModifiedFlag(); if( lpNowImage != NULL) delete []lpNowImage; } } void CImageLABView::OnUpdateCaptureCcd(CCmdUI* pCmdUI) { CImageLABDoc* pDoc = GetDocument(); if( pDoc->Image.m_SorceType == 1 ) { pCmdUI->Enable(true); pCmdUI->SetCheck(!bFreeze); } else pCmdUI->Enable(false); } void CImageLABView::OnShowpin() { for(int i= 0; i< MAXPINNUM; i++) { if( m_Pin[i] == NULL ) continue; IsPinVisible = m_Pin[i]->IsWindowVisible(); m_Pin[i]->ShowWindow(IsPinVisible ? SW_HIDE : SW_NORMAL); } } void CImageLABView::OnUpdateShowpin(CCmdUI* pCmdUI) { pCmdUI->SetText(IsPinVisible ? "隐藏标记" : "显示标记"); pCmdUI->SetCheck(IsPinVisible); } void CImageLABView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { CString strBuffer; strBuffer = AfxGetApp()->GetProfileString("Settings", "Print Number"); if(!strBuffer.IsEmpty()) { _stscanf(strBuffer, "%d", &m_PrintNumber); } else m_PrintNumber = 0; m_PrintNumber++; strBuffer.Format("%d",m_PrintNumber); AfxGetApp()->WriteProfileString("Settings", "Print Number", strBuffer); // TODO: Add your specialized code here and/or call the base class // get string to show as "filename" in header/footer LPCTSTR pszFileName = GetDocument()->GetPathName(); if (pszFileName[0] == 0) pszFileName = GetDocument()->GetTitle(); // go thru global CPageSetupDlg to format the header and footer CString strHeader = CString( pszFileName ); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); int cyChar = tm.tmHeight; CRect rectPage = pInfo->m_rectDraw; // draw and exclude space for header if (!strHeader.IsEmpty()) { pDC->TextOut(rectPage.left, rectPage.top, strHeader); rectPage.top += cyChar + cyChar / 4; pDC->MoveTo(rectPage.left, rectPage.top); pDC->LineTo(rectPage.right, rectPage.top); rectPage.top += cyChar / 4; } CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if( m_OtherDesStore != ""|m_Patient!= ""|m_Docter!= "") { TEXTMETRIC tm; CFont fontText; fontText.CreateFont(-5*20,0,0,0,400,FALSE,FALSE,0, ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, DEFAULT_PITCH|FF_SWISS,"Arial"); CFont*pOldFont=(CFont*)pDC->SelectObject(&fontText); pDC->GetTextMetrics(&tm); rectPage.top += 100; CRect TextRect1(60, rectPage.top, rectPage.Width(), rectPage.top + 40); // pDC->SetTextAlign( TA_LEFT ); pDC->DrawText(m_Hospital+"放射科照片报告单",TextRect1, DT_NOCLIP|DT_NOPREFIX|DT_EXPANDTABS|DT_CENTER); pDC->SelectObject(pOldFont); int position=(rectPage.Width()-60)/8; rectPage.top += 320; pDC->TextOut(60, rectPage.top, "姓 名:"); pDC->TextOut(60+position, rectPage.top, m_Patient); pDC->TextOut(60+2*position, rectPage.top, "性 别:"); pDC->TextOut(60+3*position, rectPage.top, m_Sex); pDC->TextOut(60+4*position, rectPage.top, "年 龄:"); pDC->TextOut(60+5*position, rectPage.top, m_Age); pDC->TextOut(60+6*position, rectPage.top, "X光号:"); pDC->TextOut(60+7*position, rectPage.top, m_Xray); rectPage.top += 170; pDC->TextOut(60, rectPage.top, "科 别:"); pDC->TextOut(60+position, rectPage.top, m_Depart); pDC->TextOut(60+2*position, rectPage.top, "病 室:"); pDC->TextOut(60+3*position, rectPage.top, m_Room); pDC->TextOut(60+4*position, rectPage.top, "门诊号:"); pDC->TextOut(60+5*position, rectPage.top, m_Nomz); pDC->TextOut(60+6*position, rectPage.top, "住院号:"); pDC->TextOut(60+7*position, rectPage.top, m_Nozy); rectPage.top += 170; pDC->TextOut(60, rectPage.top, "印象:"); CRect TextRect3(60+position, rectPage.top, rectPage.Width()-100, rectPage.top + 600); pDC->DrawText(m_OtherDesStore, TextRect3, DT_NOCLIP|DT_NOPREFIX|DT_EXPANDTABS| DT_END_ELLIPSIS|DT_WORDBREAK|DT_LEFT); rectPage.top += 720; pDC->TextOut(60+6*position, rectPage.top, "检查医师:"); pDC->TextOut(60+7*position, rectPage.top, m_Docter); } rectPage.top += 220; int w = int( pDoc->Image.m_ImageWidth ); int h = int( pDoc->Image.m_ImageHeight ); int LimitH = rectPage.Height()* 4/ 5; double scale1 = (double)w / (double)rectPage.Width(); double scale2 = (double)h / (double)LimitH; int LeftX = 0, RightX, BottomY = rectPage.top; if( scale1 > scale2 ) { RightX = rectPage.Width(); BottomY+= int(LimitH* scale2/ scale1 + 0.5 ); } else { int TW = int( rectPage.Width()* scale1/ scale2 + 0.5 ); LeftX = rectPage.left + (rectPage.Width() - TW)/ 2; RightX = LeftX + TW; BottomY+= LimitH; } pDC->SetTextAlign( TA_CENTER ); int x, y; CString msg; CRect showrect = CRect(LeftX, rectPage.top, RightX, BottomY); if( CImageLABApp::m_iPrintMode == 1 ) { x = showrect.Width() * 2 / 3; y = showrect.Height() * 2 / 3; showrect.left = x / 4; showrect.top += y / 8; showrect.right = showrect.left + x; showrect.bottom = showrect.top + y; BottomY = showrect.bottom + y / 8; } else if( CImageLABApp::m_iPrintMode == 2 ) { x = showrect.Width() / 3; y = showrect.Height() / 3; showrect.left = x; showrect.top += y / 8; showrect.right = showrect.left + x; showrect.bottom = showrect.top + y; BottomY = showrect.bottom + y / 8; } CBitmap TagBmp , *OldBmp; BOOL is = TagBmp.LoadBitmap(IDB_BITMAP_TAG); CSize BmpSize(48, 48); int Width = 200; CDC TagDC; TagDC.CreateCompatibleDC(pDC); OldBmp = TagDC.SelectObject(&TagBmp); pDC->SetBkMode(TRANSPARENT); pDC->SetTextAlign( TA_RIGHT ); if( DashRectDrawed ) { CPoint p1, p2; GetSelectArea(p1, p2); CImage temp(pDoc->Image, p1, p2); temp.ShowCurrentImage(pDC, showrect); int tw = int( temp.m_ImageWidth ); int th = int( temp.m_ImageHeight ); for(int i= 0; i< MAXPINNUM; i++) { if( m_Pin[i] == NULL ) continue; if( m_PinPos[i].x < p1.x ) continue; if( m_PinPos[i].y < p1.y ) continue; if( m_PinPos[i].x > p2.x ) continue; if( m_PinPos[i].y > p2.y ) continue; x = showrect.left + int( (float)(m_PinPos[i].x - p1.x)* showrect.Width()/ (float)tw ); y = showrect.top + int( (float)(m_PinPos[i].y - p1.y)* showrect.Height()/ (float)th ); msg.Format("%d", i+ 1); pDC->MoveTo(x+1, y+2); pDC->LineTo(x+1+4*4, y + 2+33*4); pDC->LineTo(x+1+9*4, y+2+12*4); pDC->LineTo(x+1+40*4, y+ 2+46*4); pDC->LineTo(x+1 +46*4, y + 2+40*4); pDC->LineTo(x+1+14*4, y + 2+8*4); pDC->LineTo(x+ 1+30*4, y + 2+4*4); pDC->LineTo(x+1, y+2); pDC->TextOut(x+ Width, y, msg); } } else { pDoc->Image.ShowCurrentImage(pDC, showrect); for(int i= 0; i< MAXPINNUM; i++) { if( m_Pin[i] == NULL ) continue; x = showrect.left + int( (float)m_PinPos[i].x * showrect.Width()/ (float)w ); y = showrect.top + int( (float)m_PinPos[i].y * showrect.Height()/ (float)h ); msg.Format("%d", i+ 1); pDC->MoveTo(x+1, y+2); pDC->LineTo(x+1+4*4, y + 2+33*4); pDC->LineTo(x+1+9*4, y+2+12*4); pDC->LineTo(x+1+40*4, y+ 2+46*4); pDC->LineTo(x+1 +46*4, y + 2+40*4); pDC->LineTo(x+1+14*4, y + 2+8*4); pDC->LineTo(x+ 1+30*4, y + 2+4*4); pDC->LineTo(x+1, y+2); // pDC->StretchBlt(x, y, 200, 200, &TagDC, 0, 0, // BmpSize.cx, BmpSize.cy, MERGECOPY ); pDC->TextOut(x+ Width, y, msg); } } TagDC.SelectObject(OldBmp); pDC->SelectStockObject(NULL_BRUSH); pDC->Rectangle(showrect); // draw footer rectPage.bottom -= 3* cyChar; CTime time = CTime::GetCurrentTime(); CString strDate = time.Format(_T("%d/%m/%Y %A %H:%M:%S")); pDC->SetTextAlign( TA_CENTER ); pDC->TextOut( (rectPage.left + rectPage.right)/ 2, rectPage.bottom, strDate); rectPage.bottom -= cyChar / 4; pDC->MoveTo(rectPage.left, rectPage.bottom); pDC->LineTo(rectPage.right, rectPage.bottom); // allow space for footer pInfo->m_rectDraw = rectPage; pInfo->m_rectDraw.bottom -= cyChar + cyChar/4 + cyChar/4; } /*void CImageLABView::OnPrint(CDC* pDC, CPrintInfo* pInfo) { CString strBuffer; strBuffer = AfxGetApp()->GetProfileString("Settings", "Print Number"); if(!strBuffer.IsEmpty()) { _stscanf(strBuffer, "%d", &m_PrintNumber); } else m_PrintNumber = 0; m_PrintNumber++; strBuffer.Format("%d",m_PrintNumber); AfxGetApp()->WriteProfileString("Settings", "Print Number", strBuffer); // TODO: Add your specialized code here and/or call the base class // get string to show as "filename" in header/footer LPCTSTR pszFileName = GetDocument()->GetPathName(); if (pszFileName[0] == 0) pszFileName = GetDocument()->GetTitle(); // go thru global CPageSetupDlg to format the header and footer CString strHeader = CString( pszFileName ); TEXTMETRIC tm; pDC->GetTextMetrics(&tm); int cyChar = tm.tmHeight; CRect rectPage = pInfo->m_rectDraw; // draw and exclude space for header if (!strHeader.IsEmpty()) { pDC->TextOut(rectPage.left, rectPage.top, strHeader); rectPage.top += cyChar + cyChar / 4; pDC->MoveTo(rectPage.left, rectPage.top); pDC->LineTo(rectPage.right, rectPage.top); rectPage.top += cyChar / 4; } CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); rectPage.top += 40; int w = int( pDoc->Image.m_ImageWidth ); int h = int( pDoc->Image.m_ImageHeight ); int LimitH = rectPage.Height()* 4/ 5; double scale1 = (double)w / (double)rectPage.Width(); double scale2 = (double)h / (double)LimitH; int LeftX = 0, RightX, BottomY = rectPage.top; if( scale1 > scale2 ) { RightX = rectPage.Width(); BottomY+= int(LimitH* scale2/ scale1 + 0.5 ); } else { int TW = int( rectPage.Width()* scale1/ scale2 + 0.5 ); LeftX = rectPage.left + (rectPage.Width() - TW)/ 2; RightX = LeftX + TW; BottomY+= LimitH; } pDC->SetTextAlign( TA_CENTER ); int x, y; CString msg; CRect showrect = CRect(LeftX, rectPage.top, RightX, BottomY); if( CImageLABApp::m_iPrintMode == 1 ) { x = showrect.Width() * 2 / 3; y = showrect.Height() * 2 / 3; showrect.left = x / 4; showrect.top += y / 8; showrect.right = showrect.left + x; showrect.bottom = showrect.top + y; BottomY = showrect.bottom + y / 8; } else if( CImageLABApp::m_iPrintMode == 2 ) { x = showrect.Width() / 3; y = showrect.Height() / 3; showrect.left = x; showrect.top += y / 8; showrect.right = showrect.left + x; showrect.bottom = showrect.top + y; BottomY = showrect.bottom + y / 8; } CBitmap TagBmp , *OldBmp; BOOL is = TagBmp.LoadBitmap(IDB_BITMAP_TAG); CSize BmpSize(48, 48); int Width = 200; CDC TagDC; TagDC.CreateCompatibleDC(pDC); OldBmp = TagDC.SelectObject(&TagBmp); pDC->SetBkMode(TRANSPARENT); pDC->SetTextAlign( TA_RIGHT ); if( DashRectDrawed ) { CPoint p1, p2; GetSelectArea(p1, p2); CImage temp(pDoc->Image, p1, p2); temp.ShowCurrentImage(pDC, showrect); int tw = int( temp.m_ImageWidth ); int th = int( temp.m_ImageHeight ); for(int i= 0; i< MAXPINNUM; i++) { if( m_Pin[i] == NULL ) continue; if( m_PinPos[i].x < p1.x ) continue; if( m_PinPos[i].y < p1.y ) continue; if( m_PinPos[i].x > p2.x ) continue; if( m_PinPos[i].y > p2.y ) continue; x = showrect.left + int( (float)(m_PinPos[i].x - p1.x)* showrect.Width()/ (float)tw ); y = showrect.top + int( (float)(m_PinPos[i].y - p1.y)* showrect.Height()/ (float)th ); msg.Format("%d", i+ 1); pDC->MoveTo(x+1, y+2); pDC->LineTo(x+1+4*4, y + 2+33*4); pDC->LineTo(x+1+9*4, y+2+12*4); pDC->LineTo(x+1+40*4, y+ 2+46*4); pDC->LineTo(x+1 +46*4, y + 2+40*4); pDC->LineTo(x+1+14*4, y + 2+8*4); pDC->LineTo(x+ 1+30*4, y + 2+4*4); pDC->LineTo(x+1, y+2); pDC->TextOut(x+ Width, y, msg); } } else { pDoc->Image.ShowCurrentImage(pDC, showrect); for(int i= 0; i< MAXPINNUM; i++) { if( m_Pin[i] == NULL ) continue; x = showrect.left + int( (float)m_PinPos[i].x * showrect.Width()/ (float)w ); y = showrect.top + int( (float)m_PinPos[i].y * showrect.Height()/ (float)h ); msg.Format("%d", i+ 1); pDC->MoveTo(x+1, y+2); pDC->LineTo(x+1+4*4, y + 2+33*4); pDC->LineTo(x+1+9*4, y+2+12*4); pDC->LineTo(x+1+40*4, y+ 2+46*4); pDC->LineTo(x+1 +46*4, y + 2+40*4); pDC->LineTo(x+1+14*4, y + 2+8*4); pDC->LineTo(x+ 1+30*4, y + 2+4*4); pDC->LineTo(x+1, y+2); // pDC->StretchBlt(x, y, 200, 200, &TagDC, 0, 0, // BmpSize.cx, BmpSize.cy, MERGECOPY ); pDC->TextOut(x+ Width, y, msg); } } TagDC.SelectObject(OldBmp); pDC->SelectStockObject(NULL_BRUSH); pDC->Rectangle(showrect); // draw footer rectPage.bottom -= 3* cyChar; CTime time = CTime::GetCurrentTime(); CString strDate = time.Format(_T("%d/%m/%Y %A %H:%M:%S")); pDC->SetTextAlign( TA_CENTER ); pDC->TextOut( (rectPage.left + rectPage.right)/ 2, rectPage.bottom, strDate); rectPage.bottom -= cyChar / 4; pDC->MoveTo(rectPage.left, rectPage.bottom); pDC->LineTo(rectPage.right, rectPage.bottom); if( m_OtherDesStore != "") { pDC->SetTextAlign( TA_LEFT ); rectPage.top = BottomY + 80; pDC->TextOut(60, rectPage.top, "名 称:"); pDC->TextOut(560, rectPage.top, pDoc->ImageName); rectPage.top += 120; pDC->TextOut(60, rectPage.top, "时 间:"); pDC->TextOut(560, rectPage.top, m_DesDate); rectPage.top += 120; pDC->TextOut(60, rectPage.top, "图像描述:"); CRect TextRect(560, rectPage.top, rectPage.Width(), rectPage.bottom - 40); pDC->DrawText(m_OtherDesStore, TextRect, DT_NOCLIP|DT_NOPREFIX|DT_EXPANDTABS); } // allow space for footer pInfo->m_rectDraw = rectPage; pInfo->m_rectDraw.bottom -= cyChar + cyChar/4 + cyChar/4; } */ void CImageLABView::ReadDesFile() { CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if( IsExistFile(pDoc->ImageDesFileName) ) { CIni IniFile; CString msg; IniFile.Read( pDoc->ImageDesFileName ); IniFile.GetValue ("标记个数", " 标记个数", PinNum); int tx, ty, ti; for(int i= 0; i< PinNum; i++) { msg.Format("标记点%2d 信息", i+ 1); IniFile.GetValue (msg, " X坐标", tx); IniFile.GetValue (msg, " Y坐标", ty); IniFile.GetValue (msg, " I符号", ti); m_pinIconNO[i] = ti + IDI_ICON1; m_PinImagePos[i].x = tx; m_PinImagePos[i].y = ty; } IniFile.GetMultiValue ("图像描述", " 图像印象", m_OtherDesStore); IniFile.GetMultiValue ("医院信息", " 医生姓名", m_Docter); IniFile.GetMultiValue ("医院信息", " 病室名称", m_Room); IniFile.GetMultiValue ("医院信息", " 科别名称", m_Depart); // IniFile.GetMultiValue ("医院信息", " 医院名称", m_Hospital); IniFile.GetMultiValue ("病人信息", " 病人年龄", m_Age); IniFile.GetMultiValue ("病人信息", " 病人性别", m_Sex); IniFile.GetMultiValue ("病人信息", " 病人姓名", m_Patient); IniFile.GetMultiValue ("门诊信息", " X 光号", m_Xray); IniFile.GetMultiValue ("门诊信息", " 门诊号", m_Nomz); IniFile.GetMultiValue ("门诊信息", " 住院号", m_Nozy); IniFile.GetValue ("其它信息", " 最后修改时间", m_DesDate);//*/ // old /*FILE *lpFile; CString temp; lpFile = fopen(pDoc->ImageDesFileName, "rb"); // read the tag and tag number fscanf(lpFile, "%s %d\n", temp, &PinNum); for(int i= 0; i< PinNum; i++) { fscanf(lpFile, "%d %d %d\n", &m_PinPos[i].x, &m_PinPos[i].y, &m_pinIconNO[i]); m_pinIconNO[i] += IDI_ICON1; m_PinImagePos[i] = m_PinPos[i]; } // read the description of the image //fscanf(lpFile, "%s\n", temp); long NowPos = ftell(lpFile); fseek(lpFile, 0, SEEK_END); long EndPos = ftell(lpFile); int DesLength = EndPos - NowPos; char *sss = new char[DesLength+ 3]; fseek(lpFile, NowPos, SEEK_SET); fread( sss, 1, DesLength, lpFile); sss[DesLength ] = 0x0D; sss[DesLength+1] = 0x0A; sss[DesLength+2] = '\0'; m_OtherDesStore = CString(sss); if(sss != NULL) delete []sss; fclose(lpFile); GetDesFileTime(); //*/ // older one /*CFile * pReadFile = new CFile(pDoc->ImageDesFileName, CFile::modeRead | CFile::shareCompat); int ll = pReadFile->GetLength(); if( lpDesStr != NULL ) { delete []lpDesStr; lpDesStr = NULL; } if( ll > 0) { lpDesStr = new char[ll+ 2]; pReadFile->Read( lpDesStr, ll ); lpDesStr[ll-1] = 0x0D; lpDesStr[ll] = 0x0A; lpDesStr[ll+1] = '\0'; } pReadFile->Close(); delete pReadFile;//*/ } } void CImageLABView::SaveDesFile() { CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); /*int IsNewPin = 0; for(int i= 0, j= 0; i< MAXPINNUM; i++) { if( m_Pin[i] != NULL ) IsNewPin++; }//*/ if( IsDesTxtChanged ) { CIni IniFile; CString msg; CTime time = CTime::GetCurrentTime(); m_DesDate = time.Format(_T("%d/%m/%Y %A %H:%M:%S")); IniFile.SetValue ("标记个数", " 标记个数", PinNum); for(int i= 0, j= 1; i< MAXPINNUM; i++) { if( m_Pin[i] == NULL ) continue; m_pinIconNO[i] -= IDI_ICON1; msg.Format("标记点%2d 信息", j++); IniFile.SetValue (msg, " X坐标", m_PinImagePos[i].x); IniFile.SetValue (msg, " Y坐标", m_PinImagePos[i].y); IniFile.SetValue (msg, " I符号", m_pinIconNO[i]); } IniFile.SetMultiValue ("图像描述", " 图像印象", m_OtherDesStore); IniFile.SetMultiValue ("医院信息", " 医生姓名", m_Docter); IniFile.SetMultiValue ("医院信息", " 病室名称", m_Room); IniFile.SetMultiValue ("医院信息", " 科别名称", m_Depart); // IniFile.SetMultiValue ("医院信息", " 医院名称", m_Hospital); IniFile.SetMultiValue ("病人信息", " 病人年龄", m_Age); IniFile.SetMultiValue ("病人信息", " 病人性别", m_Sex); IniFile.SetMultiValue ("病人信息", " 病人姓名", m_Patient); IniFile.SetMultiValue ("门诊信息", " X 光号", m_Xray); IniFile.SetMultiValue ("门诊信息", " 门诊号", m_Nomz); IniFile.SetMultiValue ("门诊信息", " 住院号", m_Nozy); IniFile.SetValue ("其它信息", " 最后修改时间", m_DesDate); IniFile.Write(pDoc->ImageDesFileName); //*/ /*FILE *lpFile; lpFile = fopen(pDoc->ImageDesFileName, "wb"); // write the tag and tag number fprintf(lpFile, "%s %d", "Tag:", PinNum); fprintf(lpFile, "%c%c", 0x0D, 0x0A); for(int i= 0, j= 0; i< MAXPINNUM; i++) { if( m_Pin[i] == NULL ) continue; m_pinIconNO[i] -= IDI_ICON1; fprintf(lpFile, "%d %d %d", m_PinImagePos[i].x, m_PinImagePos[i].y, m_pinIconNO[i]); fprintf(lpFile, "%c%c", 0x0D, 0x0A); } // write the description of the image if( m_OtherDesStore != "No description") { fprintf(lpFile, "%c%c", 0x0D, 0x0A); fprintf(lpFile, "%s", m_OtherDesStore); fprintf(lpFile, "%c%c", 0x0D, 0x0A); } fclose(lpFile);//*/ } } void CImageLABView::OnPinAdd() { for(int i= 0, Which= 0; i< MAXPINNUM; i++) { if( m_Pin[i] == NULL ) { Which = i; break; } } CString tip; tip.Format("NO.%2d", Which+ 1); m_pinIconNO[Which] = IDI_ICON1 + Which; m_Pin[Which] = new CMapPin(); m_Pin[Which]->m_PinPos = m_PinPos[Which]= m_PopPoint; fShowScale = ShowScaleType[ShowScale]; m_PinImagePos[Which].x = int( m_PinPos[Which].x / fShowScale ); m_PinImagePos[Which].y = int( m_PinPos[Which].y / fShowScale ); CPoint p = m_PopPoint - ScrollOrgPt; VERIFY(m_Pin[Which]->SetIcon(AfxGetResourceHandle(), m_pinIconNO[PinNum], TRUE)); VERIFY(m_Pin[Which]->Create(tip, WS_VISIBLE | WS_CHILD, p, this, 0xFFFF)); m_Pin[Which]->SetPopupMenu(CG_IDR_POPUP_IMAGE_LABVIEW); m_Pin[Which]->SetAllowDrag(true); m_Pin[Which]->m_NO = Which; IsDesTxtChanged = true; PinNum++; } void CImageLABView::OnUpdatePinAdd(CCmdUI* pCmdUI) { pCmdUI->Enable( PinNum < MAXPINNUM ); } void CImageLABView::OnPinDel() { if( m_Pin[NowPinNo] != NULL && NowPinNo >= 0) { delete m_Pin[NowPinNo]; m_Pin[NowPinNo] = NULL; NowPinNo = -1; IsDesTxtChanged = true; } PinNum--; } void CImageLABView::OnUpdatePinDel(CCmdUI* pCmdUI) { pCmdUI->Enable( PinNum >0 && NowPinNo >= 0); } void CImageLABView::OnPinChangicon() { CSelectIcon dlg; if(dlg.DoModal() == IDOK && NowPinNo > 0) { m_pinIconNO[NowPinNo] = IDI_ICON1 + dlg.m_SlidePos; VERIFY(m_Pin[NowPinNo]->SetIcon(AfxGetResourceHandle(), m_pinIconNO[NowPinNo], TRUE)); NowPinNo = -1; IsDesTxtChanged = true; } } void CImageLABView::OnUpdatePinChangicon(CCmdUI* pCmdUI) { pCmdUI->Enable( PinNum > 0 ); } void CImageLABView::OnDescribe() { CImageLABDoc* pDoc = GetDocument(); CDescribeDlg dlg; GetDesFileTime(); dlg.m_Other = m_OtherDesStore; dlg.m_Docter = m_Docter; dlg.m_Patient = m_Patient; dlg.m_Sex = m_Sex; dlg.m_Room = m_Room; dlg.m_Depart = m_Depart; dlg.m_Xray = m_Xray; dlg.m_Nomz = m_Nomz; dlg.m_Nozy = m_Nozy; dlg.m_Age = m_Age; dlg.m_Date = m_DesDate; dlg.m_Name = pDoc->ImageName; if(dlg.DoModal() == IDOK) { if( dlg.m_Docter != ""|dlg.m_Patient!= ""|dlg.m_Other!= "") { m_OtherDesStore = dlg.m_Other; m_Docter = dlg.m_Docter; m_Patient = dlg.m_Patient; m_Sex = dlg.m_Sex; m_Age = dlg.m_Age; m_Room = dlg.m_Room; m_Depart = dlg.m_Depart; m_Nomz = dlg.m_Nomz; m_Nozy = dlg.m_Nozy; m_Xray = dlg.m_Xray; IsDesTxtChanged = true; } } } void CImageLABView::OnChangechannel() { if( CImageLABApp::SorceType == 1 ) { CG200Channel++; // if( CG200Channel > 6 ) CG200Channel -= 6; CG200Channel = CG200Channel % 6; CString msg; msg.Format("现在使用的是图像卡通道%2d进行图像采集", CG200Channel+1); pSB->SetPaneText(0, msg); CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->SetTitle(msg); if( hcg200 != NULL) { if( !bFreeze ) { CG200Capture(hcg200, false); CG200SetADParam( hcg200, AD_SOURCE, CG200Channel); CG200SetADParam( hcg200, AD_SATURATION, 255); CG200SetADParam( hcg200, AD_BRIGHTNESS, 255); CG200SetADParam( hcg200, AD_CONTRAST, 255); CG200SetADParam( hcg200, AD_HUE, 255); CG200Capture(hcg200, true); } else { CG200SetADParam( hcg200, AD_SOURCE, CG200Channel); CG200SetADParam( hcg200, AD_SATURATION, 255); CG200SetADParam( hcg200, AD_BRIGHTNESS, 255); CG200SetADParam( hcg200, AD_CONTRAST, 255); CG200SetADParam( hcg200, AD_HUE, 255); } } } } void CImageLABView::OnUpdateChangechannel(CCmdUI* pCmdUI) { //pCmdUI->Enable( hcg200 != NULL && CImageLABApp::SorceType == 1 ); pCmdUI->Enable(CImageLABApp::SorceType == 1 ); } void CImageLABView::OnPatrimagesave() { CPoint p1, p2; GetSelectArea(p1, p2); CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CImage TempImage1( pDoc->Image, p1, p2 ); CAllImage TempImage2; TempImage2.CreateEmpty( TempImage1.m_ImageWidth, TempImage1.m_ImageHeight, TempImage1.m_wImageDepth, 0); memcpy( TempImage2.m_lpDibArray, TempImage1.m_lpDibArray, TempImage1.m_ImageSize ); CString filt = "(*.JPG)|*.JPG|(*.BMP)|*.BMP|(*.PCX)|*.PCX|(*.GIF)|*.GIF||"; CFileDialog dlgFile(false, "*.JPG","", OFN_HIDEREADONLY, filt, NULL); dlgFile.m_ofn.Flags |= OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT; CString InitDir = "D:\\" + CImageLABApp::SaveFileDir; dlgFile.m_ofn.lpstrInitialDir = InitDir; if(dlgFile.DoModal()==IDOK) { TempImage2.SaveImageToFile( dlgFile.GetPathName() ); } } void CImageLABView::OnUpdatePatrimagesave(CCmdUI* pCmdUI) { pCmdUI->Enable( DashRectDrawed ); } void CImageLABView::OnPatrimageCrop() { CPoint p1, p2; GetSelectArea(p1, p2); CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CImage TempImage1( pDoc->Image, p1, p2 ); pDoc->Image.CreateEmpty( TempImage1.m_ImageWidth, TempImage1.m_ImageHeight, TempImage1.m_wImageDepth, 0); memcpy( pDoc->Image.m_lpDibArray, TempImage1.m_lpDibArray, TempImage1.m_ImageSize ); DashRectDrawed = false; pDoc->UpdateAllViews(NULL); pDoc->SetModifiedFlag(); } void CImageLABView::OnUpdatePatrimageCrop(CCmdUI* pCmdUI) { pCmdUI->Enable( DashRectDrawed ); } void CImageLABView::OnFilePrintMysetting() { CPrintModeDlg dlg; dlg.m_Select = CImageLABApp::m_iPrintMode; if( dlg.DoModal()==IDOK ) { CImageLABApp::m_iPrintMode = dlg.m_Select; //TRACE("m_iPrintMode = %d\n", CImageLABApp::m_iPrintMode ); } } void CImageLABView::OnUpdateFilePrintMysetting(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here } void CImageLABView::GetDesFileTime() { CImageLABDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if( IsExistFile(pDoc->ImageDesFileName) ) { struct _stat buf; int fh = _open( pDoc->ImageDesFileName, _O_RDONLY ); _fstat( fh, &buf ); _close( fh ); CTime time( buf.st_ctime ); m_DesDate = time.Format(_T("%d/%m/%Y %A %H:%M:%S")); } else { CTime time = CTime::GetCurrentTime(); m_DesDate = time.Format(_T("%d/%m/%Y %A %H:%M:%S")); } } void CImageLABView::OnPrintNumber() { // TODO: Add your command handler code here CString strBuffer; strBuffer = AfxGetApp()->GetProfileString("Settings", "Print Number"); if(!strBuffer.IsEmpty()) { _stscanf(strBuffer, "%d", &m_PrintNumber); } else m_PrintNumber = 0; char text[30]; sprintf(text,"打印文件数为: %d",m_PrintNumber); AfxMessageBox(text); }