📄 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 <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 + -