MFC位图显示

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haimianjie2012/article/details/83659496

void CTMVedioShow::ShowCombineFundus()

111

#pragma once
#include "afxwin.h"
#include "utility.h"
#include "UtilityObject.h"
#include "TMVedio.h"

typedef struct _COMBINEFUNDUS_ 
{
	SCANMODE mode;
	//角度
	int nAngle;
	//透明度
	BYTE byAlpha;
	// 中心位置
	DPOINT position;
	//区域宽度
	float nlength;
	//图像宽度
	long nWidth;
	//图像高度
	long nHeight;
	//合成眼底图数据
	BYTE *pBit;
	float nCrossBeamGap;
}COMBINEFUNDUS, *PCOMBINEFUNDUS;

class CTMVedioShow :
	public CStatic
{
	DECLARE_DYNAMIC(CTMVedioShow)
protected:
	DECLARE_MESSAGE_MAP()
private:
	//图像数据
	BYTE *m_pbyReversebuff;
	//图像高
	DWORD m_nImgHeight ;
	//图像宽
	DWORD m_nImgWidth;
	//图像头信息
	BYTE *m_pHeaderBuffer;
	//图像信息
	LPBITMAPINFO m_pBitmapInfo;
	//调色板
	CPalette *m_pPalette;
	//是否反转图像
	//BOOL m_bReverse;
	//合成眼底图信息
	PCOMBINEFUNDUS m_comfinefundusinfo;
	//合成眼底图透明度
	BYTE m_byAlpha;
	//扫描线颜色
	const COLORREF m_clScanLine;
	//扫描直线tuodong角度
	float m_nAngle_drag;
	//瞳孔中心点
	DPOINT m_irisCenter;
	DPOINT m_irisCenter1;
	//瞳孔半径
	UINT m_nRadius;
	//瞳孔中心点 
	CRect m_IrisCenterRect;
protected:
	//显示合成眼底图
	void ShowCombineFundus();
public:
	CTMVedioShow(void);
public:
	~CTMVedioShow(void);
public:
	//override
	void PreSubclassWindow();
	//override
	void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
	//设置文件路径
	void SetImage(BYTE *pbyBit, BOOL bReverse = FALSE);
	//设置合成眼底图信息
	void SetCombineFundusInfo(PCOMBINEFUNDUS pFundusInfo);
	//设置合成眼底图透明度
	void SetCombineFundusAlpha(BYTE byAlpha);
	//区域扫描线
	void DrawRangle(CDC *pDC);
	//六线扫描
	void DrawSixLine(CDC *pDC);
	//直线扫描
	void DrawLine(CDC *pDC);
	//画扫描线
	void DrawVirtualScanLine(CDC *pDC);
	void DrawCrossBeam(CDC *pDC);
	/************************************************************************
	* 功能描述: 画算法定位到的瞳孔圆盘
	* 输入参数:
	* 输出参数:
	* 返回参数:
	* 其它说明:
	************************************************************************/
	void DrawIris(CDC *pDC);
	/************************************************************************
	* 功能描述: 画瞳孔红圆圈
	* 输入参数:
	* 输出参数:
	* 返回参数:
	* 其它说明:
	************************************************************************/
	void DrawRedCircle(CDC *pDC, CRect &rt, DPOINT &center, UINT nRadius, COLORREF clColor, BOOL bFill = TRUE);
	void SetIrisCenterAndRadius(POINT* center,int radius);
};

222

#include "StdAfx.h"
#include "TMVedioShow.h"
#include "ScanParam.h"
#include "Log.h"

IMPLEMENT_DYNAMIC(CTMVedioShow, CStatic)

BEGIN_MESSAGE_MAP(CTMVedioShow, CStatic)

END_MESSAGE_MAP()

CTMVedioShow::CTMVedioShow(void)
: m_clScanLine(RGB(255, 0, 0))
{
	m_nRadius=0;
#ifndef NEW_OSE2000
	m_nImgHeight =VEDIOHDHEIGHT ;//VEDIOHEIGHT - VEDIO_TOP_CUT - VEDIO_BOTTOM_CUT;
	m_nImgWidth = VEDIOHDWIDTH;//VEDIOWIDTH - VEDIO_LEFT_CUT - VEDIO_RIGHT_CUT;
	CLog::GetInstance()->WriteLog(_T("CTMVedioShow::CTMVedioShow NEW_OSE2000"));
#else
	m_nImgHeight = VEDIOHEIGHT;
	m_nImgWidth = VEDIOWIDTH;
	CLog::GetInstance()->WriteLog(_T("CTMVedioShow::CTMVedioShow 320 240"));
#endif
	CLog::GetInstance()->WriteLog(_T("CTMVedioShow::CTMVedioShow"));

	//randongmei:20180409
	//DWORD nSize = WIDTHBYTES(m_nImgWidth * 8) * m_nImgHeight;
	DWORD nSize = m_nImgWidth *  m_nImgHeight*3;
	m_pbyReversebuff = (BYTE *)malloc(nSize);
	memset(m_pbyReversebuff, 0, nSize);
	CLog::GetInstance()->WriteLog(_T("CUtilityObject::GetInstance()"));

	m_pHeaderBuffer = CUtilityObject::GetInstance()->tmImage.Create8GrayscaleBMPINFO(m_nImgWidth, m_nImgHeight);
	m_pBitmapInfo = (LPBITMAPINFO)m_pHeaderBuffer;
	CLog::GetInstance()->WriteLog(_T("CUtilityObject::GetInstance()"));

	m_pPalette = CUtilityObject::GetInstance()->tmImage.Create8GrayscalePalette();
	//m_comfinefundusinfo = NULL;
	//m_bReverse = FALSE;
	m_nAngle_drag=0.0;
}

CTMVedioShow::~CTMVedioShow(void)
{
	free(m_pbyReversebuff);
	free(m_pHeaderBuffer);
	delete m_pPalette;
}

void CTMVedioShow::PreSubclassWindow()
{
	CLog::GetInstance()->WriteLog(_T("CTMVedioShow::PreSubclassWindow"));

	DWORD dwStyle = GetStyle();
	SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_OWNERDRAW | SS_NOTIFY);
	CStatic::PreSubclassWindow();
	CLog::GetInstance()->WriteLog(_T("CStatic::PreSubclassWindow"));
}

void CTMVedioShow::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
	//CLog::GetInstance()->WriteLog(_T("CTMVedioShow::DrawItem"));
	CRect rt;
	GetClientRect(&rt);
	CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
	
	CPalette *oldpalette = pDC->SelectPalette(m_pPalette, TRUE);
	pDC->RealizePalette();

	HDC hdc = pDC->GetSafeHdc();
	HDC hdcMem = CreateCompatibleDC(hdc);
	HBITMAP bmpMem = CreateCompatibleBitmap(hdc, m_nImgWidth, m_nImgHeight);
	HGDIOBJ holdBmp = ::SelectObject(hdcMem, bmpMem);
	//CLog::GetInstance()->WriteLog(_T("::SelectObject(hdcMem, bmpMem)"));
#ifndef NEW_OSE2000
	CRgn rgn;
	rgn.CreateEllipticRgn(0, 0, m_nImgWidth, m_nImgHeight/*rt.Width(), rt.Height()*/);
	//pDC->SelectClipRgn(&rgn);
	SelectClipRgn(hdcMem, rgn);
	CLog::GetInstance()->WriteLog(_T("NEW_OSE2000"));
#endif
	//pDC->SelectClipRgn(&rgn);
	SetStretchBltMode(hdc, COLORONCOLOR);
	SetDIBits(hdcMem, bmpMem, 0, m_nImgHeight, m_pbyReversebuff, m_pBitmapInfo, DIB_RGB_COLORS);
		//CLog::GetInstance()->WriteLog(_T("SetDIBits"));
	StretchBlt(hdc, 0, 0, rt.Width(), rt.Height(), hdcMem, 0, 0, m_nImgWidth, m_nImgHeight, SRCCOPY);
		//CLog::GetInstance()->WriteLog(_T("StretchBlt"));

	pDC->SelectPalette(oldpalette, TRUE);
	TRACE("CTMVedioShow dramitem.\n");
	DeleteObject(hdcMem);
	DeleteObject(holdBmp);
	DeleteObject(bmpMem);
	//DrawVirtualScanLine(pDC);	
	DrawIris(pDC);
	ReleaseDC(pDC);
	//CLog::GetInstance()->WriteLog(_T("ReleaseDC"));
	//ShowCombineFundus();
}

void CTMVedioShow::SetImage(BYTE *pbyBit, BOOL bReverse)
{
	
#ifndef NEW_OSE2000
	memcpy(m_pbyReversebuff,pbyBit,m_nImgWidth*m_nImgHeight);
	CLog::GetInstance()->WriteLog(_T("CTMVedioShow::SetImage NEW_OSE2000"));
#else
 	int nbottom = VEDIOHEIGHT-1;
 	int ntop = 0;
 	int nleft = 0;
 	int nright = VEDIOWIDTH-1;
 	int w = 0, h = 0;
 	for (int i=nbottom; i>=ntop; i--)
 	{
 		w = 0;
 		for (int j=nright; j>=nleft; j--)
 		{
 			m_pbyReversebuff[h * m_nImgWidth + w] = pbyBit[i * VEDIOWIDTH + j];
 			w++;
 		}
 		h++;
 	}
	//m_pbyReversebuff=pbyBit;
	//CLog::GetInstance()->WriteLog(_T("CTMVedioShow::SetImage else for"));

#endif
	
}

void CTMVedioShow::ShowCombineFundus()
{
	if (!(m_comfinefundusinfo->mode == OCT3000_MACULAAREA ||
		m_comfinefundusinfo->mode == OCT3000_GLAUCOMADISC ||
		m_comfinefundusinfo->mode == OCT3000_GLAUCOMAMACULA ||
		m_comfinefundusinfo->mode == OCT3000_MACULAAREAVESSEL ||
		m_comfinefundusinfo->mode == OCT3000_DISCAREAVESSEL)
		)
		return;

	//合成眼底图数据
	BYTE *pFundus = m_comfinefundusinfo->pBit;
	//图像宽、高
	int nWidth = m_comfinefundusinfo->nWidth;
	int nHeight = m_comfinefundusinfo->nHeight;
	//虚拟窗口矩形
	CRect rtVirtual;
	GetClientRect(&rtVirtual);
	//实际窗口矩形
	REALSCREEN_RECT rtReal;
	CScanParam *pParam = CScanParam::GetInstance();
	rtReal.left = (float)pParam->GetMinSH();
	rtReal.right = (float)pParam->GetMaxSH();
	rtReal.top = (float)pParam->GetMaxSL();
	rtReal.bottom = (float)pParam->GetMinSL();
	//实际窗口原点
	DPOINT origin;
	//origin.x = (rtReal.left + rtReal.right) / 2;
	//origin.y = (rtReal.top + rtReal.bottom) / 2;

	//虚拟扫描中心点
	DPOINT pos = m_comfinefundusinfo->position;
	//虚拟扫描线长度
	int nLength = m_comfinefundusinfo->nlength;
	//位置
	int nLeft = pos.x - nLength / 2;
	int nTop = pos.y - nLength / 2;
	//刷新背景
	BYTE *pHeaderBuffer = CUtilityObject::GetInstance()->tmImage.Create8GrayscaleBMPINFO(nWidth, nHeight);
	BITMAPINFO *pBitmapInfo = (LPBITMAPINFO)pHeaderBuffer;
	pBitmapInfo->bmiHeader.biHeight = -nHeight;
	CPalette *pPalette = CUtilityObject::GetInstance()->tmImage.Create8GrayscalePalette();

	CDC *pDC = this->GetDC();
	CPalette *oldpalette = pDC->SelectPalette(pPalette, TRUE);
	pDC->RealizePalette();

	HDC hdc = pDC->GetSafeHdc();
	HDC hdcMem = CreateCompatibleDC(hdc);
	HBITMAP bmpMem = CreateCompatibleBitmap(hdc, nWidth, nHeight);
	HGDIOBJ holdBmp = ::SelectObject(hdcMem, bmpMem);

	SetStretchBltMode(hdc, COLORONCOLOR);
	SetDIBits(hdcMem, bmpMem, 0, nHeight, pFundus, pBitmapInfo, DIB_RGB_COLORS);

	BLENDFUNCTION bf;
	bf.AlphaFormat = 0;   
	bf.BlendFlags = 0;   
	bf.BlendOp = AC_SRC_OVER;
	bf.SourceConstantAlpha = m_byAlpha;
	//显示半透明图像
	AlphaBlend(hdc, nLeft, nTop, nLength, nLength, hdcMem, 0, 0, nWidth, nHeight, bf);
	pDC->SelectPalette(oldpalette, TRUE);

	DeleteObject(hdcMem);
	DeleteObject(holdBmp);
	DeleteObject(bmpMem);
	ReleaseDC(pDC);

	free(pHeaderBuffer);
	delete pPalette;
}

void CTMVedioShow::SetCombineFundusInfo(PCOMBINEFUNDUS pFundusInfo)
{
	m_comfinefundusinfo = pFundusInfo;
}

void CTMVedioShow::SetCombineFundusAlpha(BYTE byAlpha)
{
	m_byAlpha = byAlpha;
	Invalidate();
}

void CTMVedioShow::DrawLine(CDC *pDC)
{
	int nAngle =/*180 -  */m_comfinefundusinfo->nAngle;
	float linelength = m_comfinefundusinfo->nlength;
	DPOINT center = m_comfinefundusinfo->position;

	CPen pen, *oldpen;
	pen.CreatePen(PS_SOLID, 1, m_clScanLine);
	oldpen = pDC->SelectObject(&pen);
	CPoint start, end;

	double sina = sin(nAngle / 180.0 * PI);
	double cosa = cos(nAngle / 180.0 * PI);

	start.x = (LONG)(center.x + (linelength / 2) * cosa);
	start.y = (LONG)(center.y - (linelength / 2) * sina);
	// CLog::GetInstance()->WriteLog(_T("start.x %d,center.x %d,linelength %d"),start.x,center.x,linelength);


	end.x = (LONG)(center.x - (linelength / 2) * cosa);
	end.y = (LONG)(center.y + (linelength / 2) * sina);

	pDC->MoveTo(start);
	pDC->LineTo(end);
	//CLog::GetInstance()->WriteLog(_T("Start(%d, %d), End(%d, %d)."), start.x, start.y, end.x, end.y);
	//DrawGreenCircle(pDC, m_LineCenterRect, m_center, m_nInRtLenght, RGB(0, 255, 0), FALSE);

	m_nAngle_drag = m_comfinefundusinfo->nAngle;
	//上肩头=======begin
	double theta = PI/6;//箭头两侧直线与所画直线之间的夹角
	double len = 10.0;//箭头两侧直线的长度
	double theta1,theta2;//所画直线与水平方向之间的夹角
	if (m_nAngle_drag <= 90)
	{
		theta1 = atan2 (double (end.y - start.y), double(end.x - start.x));
		pDC->MoveTo(start);
		pDC->LineTo((int)(start.x + len * cos(theta + theta1)), (int)(start.y + len * sin(theta + theta1)));
		pDC->MoveTo(start);
		pDC->LineTo((int)(start.x + len * cos(theta1 - theta)), (int)(start.y + len * sin(theta1 - theta)));
		//CLog::GetInstance()->WriteLog(_T("m_nAngle: 1111111111111111     %lf, %lf"), m_nAngle,m_nAngle_drag);
	}
	else
	{
		theta1 = atan2 (double (end.y - start.y), double(end.x - start.x));
		theta2 = -atan2 (double(end.y - start.y), double(end.x - start.x));
		pDC->MoveTo(end);
		pDC->LineTo((int)(end.x - len * cos(theta + theta1)), (int)(end.y - len * sin(theta + theta1)));
		pDC->MoveTo(end);
		pDC->LineTo((int)(end.x - len * cos(theta1 - theta)), (int)(end.y - len * sin(theta1 - theta)));
	}
	///////=================end  加箭头
	pDC->SelectObject(oldpen);
}

void CTMVedioShow::DrawRangle(CDC *pDC)
{
	int linelength = m_comfinefundusinfo->nlength;
	DPOINT center = m_comfinefundusinfo->position;

	CRect rt;
	rt.left = center.x - (linelength >> 1);
	rt.top = center.y - (linelength >> 1);
	rt.right = rt.left + linelength;
	rt.bottom = rt.top + linelength;
	rt.InflateRect(1, 1, 1, 1);

	CBrush brush, *oldbrush;
	brush.CreateSolidBrush(m_clScanLine);
	oldbrush = pDC->SelectObject(&brush);
	//矩形
	pDC->FrameRect(&rt, &brush);
	pDC->SelectObject(oldbrush);
}

void CTMVedioShow::DrawSixLine(CDC *pDC)
{
	int linelength = m_comfinefundusinfo->nlength;
	DPOINT center = m_comfinefundusinfo->position;

	double amplitude = linelength >> 1;
	float sin_AOA, cos_AOA;
	const short angle = 30;
	//const double PI = 3.1415926;
	CPen pen, *oldpen;
	pen.CreatePen(PS_SOLID, 1, m_clScanLine);
	oldpen = pDC->SelectObject(&pen);
	CPoint start, end;
	for (int i=0; i<6; i++)
	{
		//起点 
		sin_AOA = (float)(amplitude * sin(i * angle / 180.0 * PI));
		cos_AOA = (float)(amplitude * cos(i * angle / 180.0 * PI));
		start.x = (LONG)(center.x + sin_AOA);
		start.y = (LONG)(center.y + cos_AOA);
		//终点
		sin_AOA = (float)(amplitude * sin((i * angle + 180) / 180.0 * PI));
		cos_AOA = (float)(amplitude * cos((i * angle + 180) / 180.0 * PI));
		end.x = (LONG)(center.x + sin_AOA);
		end.y = (LONG)(center.y + cos_AOA);

		pDC->MoveTo(start);
		pDC->LineTo(end);

		double theta = PI/6;//箭头两侧直线与所画直线之间的夹角
		double len = 10.0;//箭头两侧直线的长度
		double theta1,theta2;//所画直线与水平方向之间的夹角
		if (i == 0)
		{
			theta1 = atan2 (double (start.y - end.y), double(start.x - end.x));
			//theta2 = -atan2 (double(end.y - start.y), double(end.x - start.x));
			pDC->MoveTo(end);
			pDC->LineTo((int)(end.x + len * cos(theta + theta1)), (int)(end.y + len * sin(theta + theta1)));//point3
			pDC->MoveTo(end);
			pDC->LineTo((int)(end.x + len * cos(theta1 - theta)), (int)(end.y + len * sin(theta1 - theta)));//point4
			continue;
		}
		theta1 = atan2 (double (end.y - start.y), double(end.x - start.x));
		//theta2 = -atan2 (double(end.y - start.y), double(end.x - start.x));
		pDC->MoveTo(start);
		pDC->LineTo((int)(start.x + len * cos(theta + theta1)), (int)(start.y + len * sin(theta + theta1)));//point3
		pDC->MoveTo(start);
		pDC->LineTo((int)(start.x + len * cos(theta1 - theta)), (int)(start.y + len * sin(theta1 - theta)));//point4

	}
	//设置矩形
	//CPoint topleft, bottomright;
	//topleft.x = (LONG)(m_center.x - amplitude);
	//topleft.y = (LONG)(m_center.y - amplitude);
	//bottomright.x = (LONG)(m_center.x + amplitude);
	//bottomright.y = (LONG)(m_center.y + amplitude);
	//m_AreaRect.SetRect(topleft, bottomright);
	pDC->SelectObject(oldpen);
}

void CTMVedioShow::DrawVirtualScanLine(CDC *pDC)
{
	//CLog::GetInstance()->WriteLog(_T("ReleaseDC"));

	switch (m_comfinefundusinfo->mode)
	{
	case OCT3000_SIXLINE:
	case OCT3000_HDSIXLINE:
	case OCT3000_HDSIXLINEDOUBLEEYE:
		DrawSixLine(pDC);
		break;
	case OCT3000_ANTERIORLINE:
	case OCT3000_ANTERIORLINEDCI:
	case OCT3000_MACULALINE:
	case OCT3000_MACULALINE4K:
	case OCT3000_MACULAHDLINE_DPL:
		DrawLine(pDC);
		break;
	case OCT3000_MACULAAREA:
	case OCT3000_DISCAREA:
	case OCT3000_GLAUCOMADISC:
	case OCT3000_GLAUCOMAMACULA:
	case OCT3000_MACULAAREAVESSEL:
	case OCT3000_DISCAREAVESSEL:
		DrawRangle(pDC);
		break;
	case OCT3000_MACULACROSSBEAM:
		DrawCrossBeam(pDC);
	default:
		break;
	}
}


void CTMVedioShow::DrawCrossBeam(CDC *pDC)
{
	//直线
	CPen pen;
	pen.CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
	CPen *oldpen = pDC->SelectObject(&pen);

	float gap= m_comfinefundusinfo->nCrossBeamGap;
	DPOINT center = m_comfinefundusinfo->position;
	int linelength = m_comfinefundusinfo->nlength;
	//从左边到右,从下到上
	for (int i=-2; i<3; i++)
	{
		if(i !=0 )
		{
			CPoint ptStart, ptEnd;
			//起点
			ptStart.x = center.x - linelength/2;
			ptStart.y = center.y + i * gap;
			//终点
			ptEnd.x = center.x +linelength/2;
			ptEnd.y = center.y + i * gap;
			pDC->MoveTo(ptStart);
			pDC->LineTo(ptEnd);
			//////////begin  加箭头
			double theta = PI/6;//箭头两侧直线与所画直线之间的夹角
			double len = 10.0;//箭头两侧直线的长度
			double theta1,theta2;//所画直线与水平方向之间的夹角
			theta1 = atan2 (double (ptStart.y - ptEnd.y), double(ptStart.x - ptEnd.x));
			//theta2 = -atan2 (double(end.y - start.y), double(end.x - start.x));
			pDC->MoveTo(ptEnd);
			pDC->LineTo((int)(ptEnd.x + len * cos(theta + theta1)), (int)(ptEnd.y + len * sin(theta + theta1)));//point3
			pDC->MoveTo(ptEnd);
			pDC->LineTo((int)(ptEnd.x + len * cos(theta1 - theta)), (int)(ptEnd.y + len * sin(theta1 - theta)));//point4

			///////=================end  加箭		

		}

	}
	//竖直线
	for(int i=-2;i<3;i++)
	{
		if(i != 0)
		{
			CPoint ptStart, ptEnd;
			//起点
			ptStart.x = center.x + i*gap;
			ptStart.y = center.y - linelength/2;
			//终点
			ptEnd.x = center.x+ i*gap;
			ptEnd.y = center.y + linelength/2;
			pDC->MoveTo(ptStart);
			pDC->LineTo(ptEnd);
			//////////begin  加箭头
			double theta = PI/6;//箭头两侧直线与所画直线之间的夹角
			double len = 10.0;//箭头两侧直线的长度
			double theta1,theta2;//所画直线与水平方向之间的夹角
			theta1 = atan2 (double (ptEnd.y - ptStart.y), double(ptEnd.x - ptStart.x));
			//theta2 = -atan2 (double(end.y - start.y), double(end.x - start.x));
			pDC->MoveTo(ptStart);
			pDC->LineTo((int)(ptStart.x + len * cos(theta + theta1)), (int)(ptStart.y + len * sin(theta + theta1)));//point3
			pDC->MoveTo(ptStart);
			pDC->LineTo((int)(ptStart.x + len * cos(theta1 - theta)), (int)(ptStart.y + len * sin(theta1 - theta)));//point4
		}	

	}

	//直线
	CPen pen2;
	pen2.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
	oldpen = pDC->SelectObject(&pen2);
	CPoint ptStart, ptEnd;
	//起点
	ptStart.x = center.x -  linelength/2;
	ptStart.y = center.y ;
	//终点
	ptEnd.x = center.x +linelength/2;
	ptEnd.y = center.y ;
	pDC->MoveTo(ptStart);
	pDC->LineTo(ptEnd);
	//////////begin  加箭头
	double theta = PI/6;//箭头两侧直线与所画直线之间的夹角
	double len = 10.0;//箭头两侧直线的长度
	double theta1,theta2;//所画直线与水平方向之间的夹角
	theta1 = atan2 (double (ptStart.y - ptEnd.y), double(ptStart.x - ptEnd.x));
	//theta2 = -atan2 (double(end.y - start.y), double(end.x - start.x));
	pDC->MoveTo(ptEnd);
	pDC->LineTo((int)(ptEnd.x + len * cos(theta + theta1)), (int)(ptEnd.y + len * sin(theta + theta1)));//point3
	pDC->MoveTo(ptEnd);
	pDC->LineTo((int)(ptEnd.x + len * cos(theta1 - theta)), (int)(ptEnd.y + len * sin(theta1 - theta)));//point4

	//起点
	ptStart.x = center.x ;
	ptStart.y = center.y - linelength/2;
	//终点
	ptEnd.x = center.x;
	ptEnd.y = center.y + linelength/2;
	pDC->MoveTo(ptStart);
	pDC->LineTo(ptEnd);
	theta1 = atan2 (double (ptEnd.y - ptStart.y), double(ptEnd.x - ptStart.x));
	//theta2 = -atan2 (double(end.y - start.y), double(end.x - start.x));
	pDC->MoveTo(ptStart);
	pDC->LineTo((int)(ptStart.x + len * cos(theta + theta1)), (int)(ptStart.y + len * sin(theta + theta1)));//point3
	pDC->MoveTo(ptStart);
	pDC->LineTo((int)(ptStart.x + len * cos(theta1 - theta)), (int)(ptStart.y + len * sin(theta1 - theta)));//point4

	pDC->SelectObject(oldpen);
}
void CTMVedioShow::DrawRedCircle(CDC *pDC, CRect &rt, DPOINT &center, UINT nRadius, COLORREF clColor, BOOL bFill)
{
	CPen pen, *oldpen;
	CBrush brush, *oldbrush;
	pen.CreatePen(PS_SOLID, 1, clColor);
	oldpen = pDC->SelectObject(&pen);
	if (bFill)
		brush.CreateSolidBrush(clColor);
	else
	{
		HBRUSH hbrush  = (HBRUSH)::GetStockObject(NULL_BRUSH);
		brush.Attach(hbrush);
	}
	oldbrush = pDC->SelectObject(&brush);
	//GoLOCK();
	rt.left = center.x - nRadius;
	rt.top = center.y - nRadius;
	rt.right = center.x + nRadius;
	rt.bottom = center.y + nRadius;
	//GoUNLOCK();
	pDC->Ellipse(&rt);	/*CPoint cpStart, cpEnd;*/



	pDC->SelectObject(oldpen);
	pDC->SelectObject(oldbrush);
}
void CTMVedioShow::DrawIris(CDC *pDC)
{
	if (m_nRadius>0&&m_irisCenter.x>0.0&&m_irisCenter.y>0.0)
	{
		DrawRedCircle(pDC, m_IrisCenterRect, m_irisCenter, m_nRadius, RGB(255, 0, 0), FALSE);
		//DrawGreenCircle(pDC, m_IrisCenterRect, m_irisCenter1, m_nRadius, RGB(0, 255, 0), FALSE);
		//m_nRadius=-1;
		//CLog::GetInstance()->WriteLog(_T("DrawGreenCircle:瞳孔半径m_nRadius,%u"),m_nRadius);
	}

}
void CTMVedioShow::SetIrisCenterAndRadius(POINT* center,int radius)
{
	//CLog::GetInstance()->WriteLog(_T("瞳孔中心,x:%d,y:%d;"),center->x,center->y);
	//GoLOCK();
	if (radius==-1)
	{
		m_nRadius=0;
	}else
	{
		m_nRadius=radius*1.175;
	}
// 	m_irisCenter.x=320-(double)center->x;
// 	m_irisCenter.y=(double)center->y;
	m_irisCenter.x=(320-(double)center->x)*1.175;
	m_irisCenter.y=(double)center->y*1.175;
	
	//CLog::GetInstance()->WriteLog(_T("瞳孔中心,x:%lf,y:%lf;瞳孔半径:%d;%u"),m_irisCenter.x,m_irisCenter.y,radius,m_nRadius);
}

333

猜你喜欢

转载自blog.csdn.net/haimianjie2012/article/details/83659496