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

📄 mt.cpp

📁 超声影像工作站系统可与各种型号的B超、彩超连接
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// MT.cpp

#include "stdafx.h"
#include "bxt.h"
#include "mt.h"
#include "math.h"
#include "StandardLength.h"
#include "ShowInfo.h"

FLASH_ARG*		pFA	= NULL;
UINT			MetaThread(LPVOID pParam);

UINT
MetaThread(LPVOID pParam)
{
	return	(FALSE);

	static	BOOL	bIsRunning		= FALSE;
	if	(FALSE	!= bIsRunning)		return	(-1L);
	bIsRunning	= TRUE;

	CMeta				*pMeta		= NULL;
#ifdef	_DEBUG
	int		iIndex	= 0;
	CString	sCaption;
#endif

	for(;;)
	{
#ifdef	_DEBUG
		iIndex++;
		sCaption.Format("Current Index: %d, ", iIndex);
		if	(NULL == pFA)
		{
			sCaption	+= "NULL";
		}
		else
		{
			switch	(pFA->iControl)
			{
			case	MT_CONTROL_PLAY:
				sCaption	+= "MT_CONTROL_PLAY";
				break;
			case	MT_CONTROL_PAUSE:
				sCaption	+= "MT_CONTROL_PAUSE";
				break;
			case	MT_CONTROL_ON:
				sCaption	+= "MT_CONTROL_ON";
				break;
			case	MT_CONTROL_OFF:
				sCaption	+= "MT_CONTROL_OFF";
				break;
			case	MT_CONTROL_REVERSE:
				sCaption	+= "MT_CONTROL_REVERSE";
				break;
			case	MT_CONTROL_STOP:
				sCaption	+= "MT_CONTROL_STOP";
				break;
			case	MT_CONTROL_END:
				sCaption	+= "MT_CONTROL_END";
				break;
			default:
				sCaption	+= "???";
				break;
			}
		}

		AfxGetMainWnd()->SetWindowText(sCaption);
#endif
		if	(NULL	!= pFA)
		{
			pFA->bLocked				= TRUE;
		}
		else
		{
			::Sleep(500);
			continue;
		}

		pMeta						= (CMeta *)(pFA->pInstance);

		if	(MT_CONTROL_PAUSE		== pFA->iControl)
		{
		}
		else if	(MT_CONTROL_PLAY	== pFA->iControl)
		{
			pMeta->SelFlash();
		}

		pFA->bLocked					= FALSE;
		::Sleep(pFA->iDelay);
	}

	bIsRunning	= FALSE;
	return	0L;
}

/*
	关闭数据内容
*/
BOOL
CMeta::Close()
{
	CleanUp();
	m_sFilePathName	= _T("");
	return	(TRUE);
}

BOOL
CMeta::TurnX()
{
	switch	(m_iXTurn)
	{
	case	0:
	case	2:
		m_iXTurn	= (m_iXTurn == 0) ? (2) : (0);
		break;
	case	1:
	case	3:
		m_iYTurn	= (m_iYTurn == 1) ? (3) : (1);
		break;
	}
	return	(TRUE);
}

BOOL
CMeta::TurnY()
{
	switch	(m_iYTurn)
	{
	case	1:
	case	3:
		m_iXTurn	= (m_iXTurn == 1) ? (3) : (1);
		break;
	case	0:
	case	2:
		m_iYTurn	= (m_iYTurn	== 0) ? (2) : (0);
		break;
	}
	return	TRUE;
}

BOOL
CMeta::TurnLeft()
{
	m_iXTurn	= (m_iXTurn == 3) ? (0) : (m_iXTurn + 1);
	m_iYTurn	= (m_iYTurn == 3) ? (0) : (m_iYTurn + 1);
	return	TRUE;
}

BOOL
CMeta::TurnRight()
{
	m_iXTurn	= (m_iXTurn == 0) ? (3) : (m_iXTurn - 1);
	m_iYTurn	= (m_iYTurn == 0) ? (3) : (m_iYTurn - 1);
	return	TRUE;
}

/*
	设置为非活动状态
*/
BOOL
CMeta::KillActive()
{
	m_fa.iControl	= MT_CONTROL_PAUSE;
	m_bActive		= FALSE;

	SelectNone();
	m_iCurrentAction	= ACTION_NOTHING;

	return	TRUE;
}

/*
	设置为活动状态
*/
BOOL
CMeta::SetActive()
{
	m_fa.pInstance	= this;
	m_fa.iControl	= MT_CONTROL_PLAY;
	m_fa.hWnd		= m_hWnd;

	pFA				= &m_fa;

	m_bActive		= TRUE;

	return	TRUE;
}

/*
	判断当前是否处于活动状态
*/
BOOL
CMeta::IsActive()
{
	return	(m_bActive);
}

/*
	判断当前是否正在记录数据
*/
BOOL
CMeta::IsRecording()
{
	return	(m_bRecording);
}

/*
	设置放缩
*/
BOOL
CMeta::SetZoom(BOOL bIsZoom)
{
	m_bIsZoom	= bIsZoom;
	return	(TRUE);
}

/*
	删除一组记录(从 TYPE_HEADER 到 TYPE_END 或 NULL)
*/
BOOL
CMeta::EraseRecord(CMeta::ITEM *node)
{
	if	(FALSE	== FindNode(node))
	{
		return	(FALSE);
	}
	if	(TYPE_START	!= node->type)
	{
		return	(FALSE);
	}
	if	(node		== m_pSelItem)	SelectNone();

	ITEM	*pLast	= node->prior;
	do
	{
		EraseNode(pLast->next);
	}
	while	(NULL	!= pLast->next && TYPE_START	!= pLast->next->type);

	SaveFile();

	return (TRUE);
}

/*
	在列表中查找节点
*/
BOOL
CMeta::FindNode(CMeta::ITEM *node)
{
	ITEM	*p	= NULL;

	for	(p = m_tItemHeader.next; NULL != p; p = p->next)
	{
		if	(node	== p)
		{
			return	(TRUE);
		}
	}

	return	(FALSE);
}

/*
	查找特定类型记录的头
*/
CMeta::ITEM	*
CMeta::FindRecord(DWORD dwRecordType, CMeta::ITEM* pStart)
{
	ITEM	*p			= NULL;

	p	= (NULL	== pStart) ? (m_tItemHeader.next) : (pStart);
	for	(; NULL != p; p = p->next)
	{
		if	(TYPE_START		!= p->type)			continue;
		if	(dwRecordType	== p->dwRecordType)	return	(p);
	}
	
	return	(NULL);
}

/*
	创建新的信息头
*/
VOID
CMeta::SetNewHeader()
{
	m_InfoHeader.MTTag				= 0x544d;			// MT
	m_InfoHeader.iVersion			= _THIS_VERSION_;	//	1.00

	m_InfoHeader.SourceDCInited		= FALSE;
	m_InfoHeader.SourcePICInited	= FALSE;
	m_InfoHeader.TargetDCInited		= FALSE;
	m_InfoHeader.TargetPICInited	= FALSE;

	m_InfoHeader.NormalColor		= RGB(255, 0, 0);
	m_InfoHeader.TempColor			= RGB(0, 255, 0);
	m_InfoHeader.FlashDarkColor		= RGB(0, 0, 255);
	m_InfoHeader.FlashLightColor	= RGB(0, 255, 0);

	m_InfoHeader.fD1				= 768.0;
	m_InfoHeader.fD2				= 20.0;
	m_InfoHeader.iDelay				= 200;
	strcpy(m_InfoHeader.sUnit, "CM");
}

/*
	删除选择的一组记录
*/
BOOL
CMeta::EraseSel()
{
	ITEM	*pSelLast	= NULL;

	if	(NULL == m_pSelItem || TYPE_START != m_pSelItem->type)
	{
		return (FALSE);
	}

	pSelLast	= m_pSelItem->prior;
	m_pSelItem	= NULL;

	do
	{
		EraseNode(pSelLast->next);
	}
	while	(NULL	!= pSelLast->next && TYPE_START	!= pSelLast->next->type);

	SaveFile();

	return TRUE;
}

/*
	判断是否存在选择的内容
*/
BOOL
CMeta::HasSelected() const
{
	return	(NULL != m_pSelItem);
}

/*
	用于 DEBUG 版本写入测试数据
*/
BOOL
CMeta::LogString(CHAR *str)	const
{
	FILE	*fp	= NULL;

	fp	= fopen("c:\\pwin98\\desktop\\test.txt","wa+");
	if	(NULL == fp)	return	FALSE;
	fprintf(fp,str);
	fclose(fp);

	return	TRUE;
}	

/*
	设置源设备区域
*/
VOID
CMeta::SetSourceDCRect(RECT &rect)
{
	m_InfoHeader.SourceDCRect.left		= rect.left;
	m_InfoHeader.SourceDCRect.top		= rect.top;
	m_InfoHeader.SourceDCRect.right		= rect.right;
	m_InfoHeader.SourceDCRect.bottom	= rect.bottom;

	m_InfoHeader.SourceDCInited			= TRUE;
}

/*
	获取源设备区域
*/
BOOL
CMeta::GetSourceDCRect(RECT &rect) const
{
	if	(FALSE == m_InfoHeader.SourceDCInited)	return	FALSE;
	rect	= m_InfoHeader.SourceDCRect;
	return	TRUE;
}

/*
	设置源图片区域
*/
VOID
CMeta::SetSourcePICRect(RECT &rect)
{
	m_InfoHeader.SourcePICRect.left		= rect.left;
	m_InfoHeader.SourcePICRect.top		= rect.top;
	m_InfoHeader.SourcePICRect.right	= rect.right;
	m_InfoHeader.SourcePICRect.bottom	= rect.bottom;

	m_InfoHeader.SourcePICInited		= TRUE;
}

/*
	获取源图片区域
*/
BOOL
CMeta::GetSourcePICRect(RECT &rect) const
{
	if	(FALSE == m_InfoHeader.SourcePICInited)	return	FALSE;
	rect	= m_InfoHeader.SourcePICRect;
	return	TRUE;
}

/*
	设置目标设备区域
*/
VOID
CMeta::SetTargetDCRect(RECT &rect)
{
	m_InfoHeader.TargetDCRect.left		= rect.left;
	m_InfoHeader.TargetDCRect.top		= rect.top;
	m_InfoHeader.TargetDCRect.right		= rect.right;
	m_InfoHeader.TargetDCRect.bottom	= rect.bottom;

	m_InfoHeader.TargetDCInited			= TRUE;
}

/*
	获取目标设备区域
*/
BOOL
CMeta::GetTargetDCRect(RECT &rect) const
{
	if	(FALSE == m_InfoHeader.TargetDCInited)	return	FALSE;
	rect	= m_InfoHeader.TargetDCRect;

	return	TRUE;
}

/*
	设置目标图片区域
*/
VOID
CMeta::SetTargetPICRect(RECT &rect)
{
	m_InfoHeader.TargetPICRect.left		= rect.left;
	m_InfoHeader.TargetPICRect.top		= rect.top;
	m_InfoHeader.TargetPICRect.right	= rect.right;
	m_InfoHeader.TargetPICRect.bottom	= rect.bottom;

	m_InfoHeader.TargetPICInited		= TRUE;
}

/*
	获取目标图片区域
*/
BOOL
CMeta::GetTargetPICRect(RECT &rect) const
{
	if	(FALSE == m_InfoHeader.TargetPICInited)	return	FALSE;
	rect	= m_InfoHeader.TargetPICRect;

	return	TRUE;
}

/*
	添加一个任意节点,节点数据由参数指针给出
	此函数仅由内部调用,函数内不做参数以及上下文的担保性有效验证。
*/
BOOL
CMeta::AppendNode(CMeta::ITEM *node)
{
	if	(NULL == node)	return	FALSE;

	ITEM	*thenode	= new	ITEM;
	memcpy(thenode, node, sizeof(ITEM));

	//	初始化新节点连接
	thenode->prior				= m_tItemHeader.prior;
	thenode->next				= NULL;

	//	更新原链表连接
	m_tItemHeader.prior->next	= thenode;
	m_tItemHeader.prior			= thenode;

	SaveFile();

	return TRUE;
}

/*
	添加一个开始记录的节点
	设置记录标志

	返回值:	
	TRUE	-	成功
	FALSE	-	失败
*/
BOOL
CMeta::BeginRecord(DWORD dwRecordType)
{
	if	(FALSE	!= m_bRecording)	return	(FALSE);

	ITEM	*node = new ITEM;

	node->type			= TYPE_START;	//	设置类型为记录开始节点
	node->dwRecordType	= dwRecordType;	//	设置记录类型
	AppendNode(node);
	delete	node;

	m_bRecording	= TRUE;
	return	(TRUE);
}

/*
	保存数据到文件中
*/
BOOL
CMeta::SaveFile(CHAR *argPathName)
{
	ITEM	*p	= NULL;
	FILE	*fp	= NULL;

	if	(NULL != argPathName)		m_sFilePathName	= argPathName;
	if	(m_sFilePathName.IsEmpty())	return	FALSE;

	fp	= fopen(m_sFilePathName,"wb");

	if (NULL == fp)		return FALSE;

	if	(1 != fwrite(&m_InfoHeader, sizeof(INFOHEADER), 1, fp))
	{
		fclose(fp);
		return	FALSE;
	}

	for (p = m_tItemHeader.next; NULL != p; p = p->next)
	{
		if	(1 != fwrite(p,sizeof(ITEM),1,fp))
		{
			fclose(fp);
			return	FALSE;
		}
	}
	fclose(fp);

	return TRUE;
}

/*
	构造函数进行初始化
*/
CMeta::CMeta()
{
	SetNewHeader();

	m_tItemHeader.type		= TYPE_LINKHEADER;
	m_tItemHeader.next		= NULL;
	m_tItemHeader.prior		= &m_tItemHeader;
	strcpy(m_tItemHeader.word, "");

	m_pSelItem				= NULL;
	m_bLightOn				= FALSE;
	m_bMouseDown			= FALSE;
	m_iCurrentPoint			= 0;
	m_hContainWnd			= NULL;
	m_hWnd					= NULL;
	m_hDC					= NULL;
	m_hCurrentPen			= NULL;

	m_bIsZoom				= FALSE;
	m_fZoomX				= 1;
	m_fZoomY				= 1;
	m_iXTurn				= 0;
	m_iYTurn				= 0;

	m_bRecording			= FALSE;

	m_iCurrentAction		= ACTION_NOTHING;

	m_fa.hWnd				= NULL;
	m_fa.iControl			= MT_CONTROL_PLAY;
	m_fa.iDelay				= 100;
	m_fa.pInstance			= this;

	m_bHideMark				= FALSE;

	return;
}

/*
	析构函数释放资源
*/
CMeta::~CMeta()
{
	m_fa.iControl			= MT_CONTROL_END;
	CleanUp();
}

/*
	释放分配的资源,不包括头记录
*/
VOID
CMeta::CleanUp()
{
	ITEM	*p		= NULL;
	ITEM	*next	= NULL;

	//	删除除头节点外的所有节点
	for (p = m_tItemHeader.next;;)
	{
		if	(NULL == p)	break;
		next = p->next;
		delete p;
		p = next;
	}

	m_tItemHeader.next	= NULL;
	m_tItemHeader.prior	= &m_tItemHeader;
	m_pSelItem			= NULL;
}

/*
	根据给定的点选择项目,选择成功返回 TRUE,否则返回 FALSE
*/
BOOL
CMeta::SelectItem(CPoint point)
{
	ITEM	*p			= NULL;
	ITEM	*first		= NULL;
	CRect	rect;

	for	(p	= m_tItemHeader.next; NULL != p; p = p->next)
	{
		if	(TYPE_START	== p->type	&& TYPE_STANDARDLENGTH	!= p->dwRecordType)
		{
			first	= p;
			continue;
		}

		if	(NULL	== first)	continue;

		if	(TYPE_END	== p->type)
		{
			first	= NULL;
			continue;
		}


		if	(TYPE_LINE	== p->type	||
			TYPE_ARROW	== p->type)
		{
			rect.SetRect(p->x0 - 2, p->y0 - 2, p->x1 + 2, p->y1 + 2);
			ConvertRect(rect);

			if	(FALSE != rect.PtInRect(point))
			{
				m_pSelItem	= first;
				MoveSelToLast();
				return	TRUE;
			}
			continue;
		}

		if	(TYPE_CROSS	== p->type)
		{
			rect.SetRect(p->x0 - 10, p->y0 - 10, p->x0 + 10, p->y0 + 10);
			if	(FALSE != rect.PtInRect(point))
			{
				m_pSelItem	= first;
				MoveSelToLast();
				return	TRUE;
			}
			continue;
		}

		if	(TYPE_TEXT	== p->type)
		{
			if	(strlen(p->word) > 0)
			{
				SIZE	size;
				::GetTextExtentPoint32(m_hDC, p->word, strlen(p->word), &size);

				rect.SetRect(
					p->x0 - size.cx / 2 - 3,
					p->y0 - size.cy / 2 - 3,
					p->x0 + size.cx / 2 + 3,
					p->y0 + size.cy / 2 + 3);
			}
			else
				rect.SetRect(p->x0 - 13, p->y0 - 8, p->x0 + 13, p->y0 + 8);

			if	(FALSE != rect.PtInRect(point))
			{
				m_pSelItem	= first;
				MoveSelToLast();
				return	TRUE;
			}
			continue;
		}

		if	(TYPE_RECT	== p->type)
		{
			CRect	rect;
			
			::SetRect(&rect, p->x0 - 3, p->y0 - 3, p->x1 + 3, p->y1 + 3);

			ConvertRect(rect);

			if	(FALSE != rect.PtInRect(point))
			{
				m_pSelItem	= first;
				MoveSelToLast();
				return	TRUE;
			}
			continue;
		}
	}
	return FALSE;
}

/*
	取消选择
*/
BOOL
CMeta::SelectNone()
{
	SelFlash(MT_SELECT_OFF);
	m_pSelItem	= NULL;
	return		TRUE;
}

/*
	闪烁选择的项目
*/
BOOL

⌨️ 快捷键说明

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