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.cxGetClientRect(&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(ShowScaleMoveToPt(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); 
	 
}