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

📄 imageprocess.cpp

📁 CT工作站具有打印报告、病历管理、图像处理专家词库等功能
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// ImageProcess.cpp : implementation file
//

#include "stdafx.h"
#include "bxt.h"
#include "ImageProcess.h"
#include "bxtdlg.h"
#include <math.h>
#include "standardlength.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// ImageProcess dialog


//	----------------------------------------------------------------------------------------------------
//	构造函数进行初始化处理
//	----------------------------------------------------------------------------------------------------
ImageProcess::ImageProcess(char *ipath,CWnd* pParent /*=NULL*/)
	: CDialog(ImageProcess::IDD, pParent)
{
	//{{AFX_DATA_INIT(ImageProcess)
	m_curPic = _T("");
	//}}AFX_DATA_INIT
	path = _T(ipath);
	cp = NULL;
	plh	= new POINT_LIST;
	plh->next	= NULL;
	plh->last	= NULL;
}

//	----------------------------------------------------------------------------------------------------
//	DDE 函数进行数据交换
//	----------------------------------------------------------------------------------------------------
void ImageProcess::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(ImageProcess)
//	DDX_Control(pDX, IDC_IMGFRAME2, m_fcur);
	DDX_Control(pDX, IDC_SCROLLBAR1, m_vs);
	DDX_Control(pDX, IDC_IMGFRAME, m_frame);
	DDX_Text(pDX, IDC_CURPIC, m_curPic);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(ImageProcess, CDialog)
	//{{AFX_MSG_MAP(ImageProcess)
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_WM_PAINT()
	ON_WM_VSCROLL()
	ON_EN_CHANGE(IDC_CURPIC, OnChangeCurpic)
	ON_WM_TIMER()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WX_DSPIMG,SetDisp)
	ON_MESSAGE(WX_DSPPRC,DispPrc)
	ON_MESSAGE(WX_DSPMSU,DispMeasure)
	ON_MESSAGE(WX_DSPMRK,DispMark)
	ON_MESSAGE(WX_DSPZOOM,DispZoom)
//	ON_MESSAGE(WX_DSPSTRETCH,DispStretch)
	ON_MESSAGE(WX_CHGPALT,ChgPlatte)
	ON_MESSAGE(WX_DSPSTRETCH,DispStretch)
	ON_MESSAGE(WX_DSPCONBRI,ChgConBri)
	ON_MESSAGE(WX_BSPWINPOS,ChgGryWin)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// ImageProcess message handlers

//	----------------------------------------------------------------------------------------------------
//	根据发送的消息设置当前的状态
//	----------------------------------------------------------------------------------------------------
void ImageProcess::DispMeasure(WPARAM wParm,LPARAM lParm)
{
	if (NULL == cp || 1 != DispStyle) return;

	if (ACTION_MEASDELETE == wParm && meas->HasSelected())
	{
		CDC	*dc	= GetDC();
		KillTimer(4);
		meas->SelFlash(dc,TRUE);
		meas->EraseSel();

		RedrawWindow();
		meas->ReDraw(dc);

		ReleaseDC(dc);

		((CBxtDlg *)AfxGetMainWnd())->
					dispmeasure->
					m_state.SetWindowText("");
		return;
	}

	m_action	= wParm;
}

void ImageProcess::DispStretch(WPARAM wParm,LPARAM lParm)
{
	stretch = wParm;
	//Invalidate(false);
	DrawImg();
}

void ImageProcess::ChgPlatte(WPARAM wParm,LPARAM lParm)
{
	mpp[curPicNum]->CreatePlate(wParm);
	DrawImg();
}

void ImageProcess::DispMark(WPARAM wParm,LPARAM lParm)
{
	if (cp == NULL || DispStyle != 1) return;

	switch(wParm)
	{
	case ACTION_ARROW:
		SelectNone();
		m_action = ACTION_ARROW;
		break;
	case ACTION_CROSS:
		SelectNone();
		m_action = ACTION_CROSS;
		break;
	case ACTION_TEXT:
		SelectNone();
		m_action = ACTION_TEXT;
		m_msg = _T((char*)lParm);
		break;
	case ACTION_DELETE:
		if (m_action != ACTION_DELETE)
		{
			m_action = ACTION_DELETE;
			return;
		}

		if (m_selitem == NULL) return;

		mark->DelNode(m_selitem);
		m_action = ACTION_NOTHING;
		SelectNone();

		delete m_selitem;
		m_selitem = NULL;

		RedrawWindow();
		ReDrawItem();
		break;
	}
}

void
ImageProcess::DispZoom(WPARAM wParm, LPARAM lParm)
{
	if	(cp == NULL || DispStyle != 1) return;

	CRect rr;
	ff[1].GetWindowRect(&rr);
	CDC *dc=ff[1].GetDC();
	mpp[curPicNum]->SetZoom(dc, wParm, (FLOAT)(rr.Width()), (FLOAT)(rr.Height()));
	mpp[curPicNum]->ZoomBMP(dc,0,0,rr.Width(),rr.Height(),0,0);
	ReleaseDC(dc);
}

void
ImageProcess::DispPrc(WPARAM wParm,LPARAM lParm)
{
	if (cp == NULL) return;
	if (imgNum < 1) return;
	
	cp = mpp[curPicNum];
	switch (wParm)
	{
	case 1://rotte left
		cp->RoteL();
		break;
	case 2://rogte right
		cp->RoteR();
		break;
	case 3://flip vertical
		cp->VertFlip();
		break;
	case 4://flip harizantal
		cp->HFlip();
		break;
	case 5://edge find
		cp->FindEdge();
		break;
	case 6://restore org
		cp->ReLoad();
		break;
	}
	//Invalidate(false);
	DrawImg();
}

void
ImageProcess::SetDisp(WPARAM wParm,LPARAM lParm)
{
	if	(DispStyle == (INT)(wParm))	return;
	DispStyle = wParm;////1 one,4-four,6-six,9-nine,2-Tile_V,3-Tile_H
	HideAllFrame();
	int ww;
	CRect rf,rvs;
	CDC *dc;
	m_vs.GetWindowRect(&rvs);
	ww=rw.Width();
	switch (DispStyle)
	{
	case 1:
		if(imgNum>1)
		{
			m_vs.SetScrollRange(1,imgNum);
			m_vs.SetScrollPos(curPicNum);
			m_vs.ShowWindow(SW_SHOW);
			ww -= rvs.Width();
		}
		else
		{
			m_vs.ShowWindow(SW_HIDE);
		}
		fw = ww;
		fh = rw.Height();
		ff[1].ShowWindow(SW_SHOW);
		ff[1].MoveWindow(0,0,fw,fh);
		TopPicNum=curPicNum;
		break;

	case 2:
		if(imgNum>2)
		{
			m_vs.SetScrollRange(1,imgNum/2+1);
			m_vs.SetScrollPos(curPicNum/2+1);
			m_vs.ShowWindow(SW_SHOW);
			ww -= rvs.Width();
		}
		else
		{
			m_vs.ShowWindow(SW_HIDE);
		}
		fw = ww/2-3;
		fh = rw.Height();
		ff[1].ShowWindow(SW_SHOW);
		ff[1].MoveWindow(1,1,fw,fh);
		ff[2].ShowWindow(SW_SHOW);
		ff[2].MoveWindow(fw+6,1,fw,fh);
		if(curPicNum+1>imgNum)
			TopPicNum=((imgNum-1)<1)?1:(imgNum-1);
		else
			TopPicNum=curPicNum;
		break; 

	case 3:
		if(imgNum>2)
		{
			m_vs.SetScrollRange(1,imgNum/2+1);
			m_vs.SetScrollPos(curPicNum/2+1);
			m_vs.ShowWindow(SW_SHOW);
			ww -= rvs.Width();
		}
		else
		{
			m_vs.ShowWindow(SW_HIDE);
		}
		fw = ww;
		fh = rw.Height()/2-3;
		ff[1].ShowWindow(SW_SHOW);
		ff[1].MoveWindow(1,1,fw,fh);
		ff[2].ShowWindow(SW_SHOW);
		ff[2].MoveWindow(1,fh+6,fw,fh);
		if(curPicNum+1>imgNum)
			TopPicNum=((imgNum-1)<1)?1:(imgNum-1);
		else
			TopPicNum=curPicNum;
		break;

	case 4:
		if(imgNum>4)
		{
			m_vs.SetScrollRange(1,imgNum/4+1);
			m_vs.SetScrollPos(curPicNum/4+1);
			m_vs.ShowWindow(SW_SHOW);
			ww -= rvs.Width();
		}
		else
		{
			m_vs.ShowWindow(SW_HIDE);
		}
		fw = ww/2-3;
		fh = rw.Height()/2-3;
		ff[1].ShowWindow(SW_SHOW);
		ff[1].MoveWindow(1,1,fw,fh,false);
		ff[2].ShowWindow(SW_SHOW);
		ff[2].MoveWindow(fw+6,1,fw,fh);
		ff[3].ShowWindow(SW_SHOW);
		ff[3].MoveWindow(1,fh+6,fw,fh);
		ff[4].ShowWindow(SW_SHOW);
		ff[4].MoveWindow(fw+6,fh+6,fw,fh);
		if(curPicNum+3>imgNum)
			TopPicNum=((imgNum-3)<1)?1:(imgNum-3);
		else
			TopPicNum=curPicNum;
		break;

	case 6:
		if(imgNum>6)
		{
			m_vs.SetScrollRange(1,imgNum/6+1);
			m_vs.SetScrollPos(curPicNum/6+1);
			m_vs.ShowWindow(SW_SHOW);
			ww -= rvs.Width();
		}
		else
		{
			m_vs.ShowWindow(SW_HIDE);
		}
		fw = ww/2-3;
		fh = rw.Height()/3-3;
		
		ff[1].ShowWindow(SW_SHOW);
		ff[1].MoveWindow(1,1,fw,fh);
		ff[2].ShowWindow(SW_SHOW);
		ff[2].MoveWindow(fw+6,1,fw,fh);

		ff[3].ShowWindow(SW_SHOW);
		ff[3].MoveWindow(1,fh+6,fw,fh);
		ff[4].ShowWindow(SW_SHOW);
		ff[4].MoveWindow(fw+6,fh+6,fw,fh);

		ff[5].ShowWindow(SW_SHOW);
		ff[5].MoveWindow(1,2*fh+12,fw,fh);
		ff[6].ShowWindow(SW_SHOW);
		ff[6].MoveWindow(fw+6,2*fh+12,fw,fh);
		if(curPicNum+5>imgNum)
			TopPicNum=((imgNum-5)<1)?1:(imgNum-5);
		else
			TopPicNum=curPicNum;
		break;

	case 9:
		if(imgNum>9)
		{
			m_vs.SetScrollRange(1,imgNum/9+1);
			m_vs.SetScrollPos(curPicNum/9+1);
			m_vs.ShowWindow(SW_SHOW);
			ww -= rvs.Width();
		}
		else
		{
			m_vs.ShowWindow(SW_HIDE);
		}
		fw = ww/3-3;
		fh = rw.Height()/3-3;
		
		ff[1].ShowWindow(SW_SHOW);
		ff[1].MoveWindow(1,1,fw,fh);
		ff[2].ShowWindow(SW_SHOW);
		ff[2].MoveWindow(fw+6,1,fw,fh);
		ff[3].ShowWindow(SW_SHOW);
		ff[3].MoveWindow(fw*2+12,1,fw,fh);

		ff[4].ShowWindow(SW_SHOW);
		ff[4].MoveWindow(1,fh+6,fw,fh);
		ff[5].ShowWindow(SW_SHOW);
		ff[5].MoveWindow(fw+6,fh+6,fw,fh);
		ff[6].ShowWindow(SW_SHOW);
		ff[6].MoveWindow(2*fw+12,fh+6,fw,fh);

		ff[7].ShowWindow(SW_SHOW);
		ff[7].MoveWindow(1,2*fh+12,fw,fh);
		ff[8].ShowWindow(SW_SHOW);
		ff[8].MoveWindow(fw+6,2*fh+12,fw,fh);
		ff[9].ShowWindow(SW_SHOW);
		ff[9].MoveWindow(2*fw+12,2*fh+12,fw,fh);
		if(curPicNum+8>imgNum)
			TopPicNum=((imgNum-8)<1)?1:(imgNum-8);
		else
			TopPicNum=curPicNum;

		break;
	}
/*	if(DispStyle!=1)
	{
		CDC *xdc=ff[curPicNum-TopPicNum+1].GetDC();
		CRect rf;
		ff[1].GetWindowRect(&rf);
		mpp[curPicNum]->DrawBMP(xdc,0 ,0 ,rf.Width(),rf.Height(),stretch,true);
		ReleaseDC(xdc);
	}
*/
}

BOOL ImageProcess::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	CRect rf;
	GetWindowRect(&rw);
	rw.left	+= 1;
	rw.top	+= 1;
	rw.bottom	-= 1;
	rw.right	-= 1;

	GetDlgItem(IDC_IMGFRAME)->GetWindowRect(&rf);
	DWORD	ss;
	ss = GetDlgItem(IDC_IMGFRAME)->GetStyle();
	ss -= WS_VISIBLE;

	for(int fn=1;fn<10;fn++)
		ff[fn].Create("",ss,rf,this,2010+fn-1);
	
	/*ff[2].Create("",ss,rf,this,2010);
	ff[3].Create("",ss,rf,this,2011);
	ff[4].Create("",ss,rf,this,2012);
	ff[5].Create("",ss,rf,this,2013);
	ff[6].Create("",ss,rf,this,2014);
	ff[7].Create("",ss,rf,this,2015);
	ff[8].Create("",ss,rf,this,2016);
	ff[9].Create("",ss,rf,this,2017);*/
	//fcur.Create("",ss,rf,this,2018);
	//GetDlgItem(IDC_IMGFRAME)->MoveWindow(0 ,0 ,rw.Width(),rw.Height());
	
	ff[1].ShowWindow(SW_SHOW);
	ff[1].MoveWindow(0,0,rw.Width(),rw.Height());
	imgNum	= 1;
	char xfilename[256];
	
	for(int ii=0;ii<100;ii++)
		mpp[ii] = new CPic;
	
	while(imgNum<100)
	{
		sprintf(xfilename,"%s%d.jpg",path.GetBuffer(200),imgNum);
		
		FILE *fp;
		fp	= fopen(xfilename,"rb");

		if (fp != NULL)
		{
			mpp[imgNum]->loadjpgGry(xfilename);
			mpp[imgNum]->SetImageID(imgNum);
			fclose(fp);
			imgNum++;
		}
		else
		{
			break;
		}
	}
	imgNum --;
	DispStyle=0;

	if(imgNum>0)
	{
		cp	= mpp[1];
		curPicNum = 1;
		TopPicNum = 1;
	}
	else
	{
		cp	= NULL;
		curPicNum = 0;
		TopPicNum = 0;
	}
	//SetDisp(1,0);
	SendMessage(WX_DSPIMG,1,0);
	mouseAction	= 0;
	stretch=0;

	char scurp[10];
	sprintf(scurp,"%d",curPicNum);
	GetDlgItem(IDC_CURPIC)->SetWindowText(scurp);
	m_frame.ShowWindow(SW_HIDE);


	m_action = ACTION_NOTHING;
	m_mousedown = false;
	/*m_itemhead = new item;
	m_itemhead->next = NULL;
	m_itemhead->last = NULL;
	m_itemhead->x0 = .0;
	m_itemhead->y0 = .0;
	m_itemhead->x1 = .0;
	m_itemhead->y1 = .0;
	m_itemhead->type = ACTION_NOTHING;
	memset(m_itemhead->word,0,MAX_TEXT_LENGTH);
	m_width = 100;
	m_height = 100;*/
	m_selitem = NULL;
	m_selmeasitem = NULL;
	CRect rmw;
	GetWindowRect(&rmw);
	m_width = rmw.Width();
	m_height = rmw.Height();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void ImageProcess::HideAllFrame()
{
	ff[1].ShowWindow(SW_HIDE);
	ff[2].ShowWindow(SW_HIDE);
	ff[3].ShowWindow(SW_HIDE);
	ff[4].ShowWindow(SW_HIDE);
	ff[5].ShowWindow(SW_HIDE);
	ff[6].ShowWindow(SW_HIDE);
	ff[7].ShowWindow(SW_HIDE);
	ff[8].ShowWindow(SW_HIDE);
	ff[9].ShowWindow(SW_HIDE);
}

void ImageProcess::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CRect cf;
	int oldcurpic	= curPicNum;

	switch(mouseAction)
	{
	case 0:
		if(DispStyle!=1)
		{
			ff[1].GetWindowRect(&cf);
			switch(DispStyle)
			{
			case 2:
				curPicNum=TopPicNum+point.x/cf.Width();
				break;
			case 3:
				curPicNum=TopPicNum+point.y/cf.Height();
				break;
			case 4:
				curPicNum=TopPicNum+point.x/cf.Width()+point.y/cf.Height()*2;
				break;
			case 6:
				curPicNum=TopPicNum+point.x/cf.Width()+point.y/cf.Height()*2;
				break;
			case 9:
				curPicNum=TopPicNum+point.x/cf.Width()+point.y/cf.Height()*3;
				break;
			}
			cp = mpp[curPicNum];
		}
		else
		{
			CDC *dc = GetDC();
			CPen pen(PS_SOLID,1,RGB(255,255,0)),*oldpen;

			m_mousedown = true;
			SetCapture();

			m_end = m_start = point;
			dc->SetTextColor(RGB(255,0,0));

			switch (m_action)
			{
			//	删除测量标记
			case ACTION_MEASDELETE:
				KillTimer(4);
				meas->SelFlash(dc,TRUE);
				meas->SelectNone();
				if (TRUE == meas->SelectItem(point))
					SetTimer(4,500,NULL);
				break;

			//	测量不规则面积(第一条线,初始化起始点和面积)
			case ACTION_MEASCHAOSAREA:
				plh->p	= point;
				m_chaos_area = 0.0;
				break;

			//	测量不规则角度(第一条线)
			case ACTION_MEASCHAOSANGLE:
				break;

			//	测量角度(第一条线)
			case ACTION_MEASANGLE:
				break;

			//	测量不规则角度(非第一条线)
			case ACTION_MEASCHAOSANGLE2:
				break;

			//	测量
			case ACTION_MEASANGLE2:
			case ACTION_MEASCHAOSAREA2:
			case ACTION_MEASLINEDIST2:
				m_end	= m_start	= m_start2;
				oldpen	= dc->SelectObject(&pen);
				dc->SetROP2(R2_XORPEN);

				dc->MoveTo(m_start);
				dc->LineTo(m_end);

				m_end	= point;

				dc->MoveTo(m_start);
				dc->LineTo(m_end);

				dc->SelectObject(oldpen);

				break;
			case ACTION_MEASLINEDIST:
				m_len	= 0.0;
				break;
			case ACTION_MEASRECTAREA:
				break;
			case ACTION_SETSTANDARDLENGTH:
				break;
			case ACTION_ARROW:
				oldpen	= dc->SelectObject(&pen);

				dc->SetROP2(R2_XORPEN);

				dc->MoveTo(m_start);

⌨️ 快捷键说明

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