📄 mt.cpp
字号:
// 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 + -