⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagelabview.cpp

📁 医学图象处理系统
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 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 <sys/stat.h>
#include <io.h>
#include <fcntl.h>


#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()<ScrollSize.cx - 20 || ViewRect.Height()<ScrollSize.cy - 10) ? true : false;
	MaxScrollRange.cx = max( (ScrollSize.cx - ViewRect.Width()), 0);
	MaxScrollRange.cy = max( (ScrollSize.cy - ViewRect.Height()), 0);
	if(MaxScrollRange.cx < 25 || MaxScrollRange.cy < 25) 
	{
		MaxScrollRange.cx = 0;
		MaxScrollRange.cy = 0;
		CanManualMove	  = false;
	}

	if( w<1000 && h<1000 )
	{
		pDoc->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);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -