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

📄 imageprocess.cpp

📁 超声影像工作站系统可与各种型号的B超、彩超连接
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		sprintf(sPicFile, "%s%d.jpg", sPathBuffer, iPicIndex);
		sprintf(sMarkFile, "%s%d.mes", sPathBuffer, iPicIndex);

		//	判断文件是否存在
		if	(NULL	== (fp	= fopen(sPicFile, "rb")))	break;
		fclose(fp);

		m_pPic[iPicIndex]		= new	CPic;

#ifdef	COLORPIC
		m_pPic[iPicIndex]->loadjpg(sPicFile);
#else
		m_pPic[iPicIndex]->loadjpgGry(sPicFile);
#endif

		m_pPic[iPicIndex]->SetImageID(iPicIndex);

		m_pMark[iPicIndex]		= new	CMeta;
		m_pMark[iPicIndex]->LoadFile(sMarkFile);
		m_pMark[iPicIndex]->SetSourceDCRect(m_rcSourceDCRect);
		m_pMark[iPicIndex]->SetSourcePICRect(m_rcSourceDCRect);
	}

	m_iPicCount	= iPicIndex - 1;	//	现在,m_iPicCount 中的数值就是当前的图象总数
	m_vs.SetScrollRange(1, (m_iPicCount > 1) ? (m_iPicCount) : (1));
	
	if	(m_iPicCount > 0)
	{
		m_pCurrentPic		= m_pPic[1];
		m_pCurrentMark		= m_pMark[1];
		m_iCurPicIndex		= 1;
		m_iTopPicIndex		= 1;
	}
	else
	{
		m_pCurrentPic		= NULL;
		m_pCurrentMark		= NULL;
		m_iCurPicIndex		= 0;
		m_iTopPicIndex		= 0;
	}

	SetCurrentPicture((m_iPicCount > 0) ? (1) : (0));

	switch	(DispStyle)
	{
	case	1:
	case	2:
	case	3:
	case	4:
	case	6:
	case	9:
		break;
	default:
		DispStyle	= 1;
		break;
	}
	//	DispStyle	= 1;
	SetDisp(DispStyle, 0);

	//	显示当前图片序号
	UpdateData(FALSE);

	m_action		= ACTION_NOTHING;
	m_bMouseDown	= FALSE;

	int		iAviIndex;
	CHAR	sAviFile[1000];

	for	(iAviIndex = 1; iAviIndex < 100; iAviIndex++)
	{
		sprintf(sAviFile, "%sx%d.avi", sPathBuffer, iAviIndex);
		if	(NULL == (fp	= fopen(sAviFile, "rb")))	break;
		fclose(fp);
	}
	m_iAviCount	= iAviIndex - 1;

	((CBxtDlg	*)AfxGetMainWnd())->dispimginfo->
		SendMessage(WX_SETSEQ, (m_iAviCount > 0) ? (1) : (0), 0);
	

	return	(TRUE);
}

void
ImageProcess::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	int		max, min;
	int		iOldPos;
	int		iNewPos;

	if		(FALSE == m_pCurrentMark->SetAction(ACTION_NOTHING, 0, NULL))	return;
	
	//	获取滚动条的最小值与最大值
	m_vs.GetScrollRange(&min, &max);

	//	取得旧位置
	iOldPos		= m_vs.GetScrollPos();

	switch	(nSBCode)
	{
	case SB_BOTTOM:
		iNewPos		= max;
		break;
	case SB_ENDSCROLL:
		iNewPos		= iOldPos;
		break;
	case SB_LINEDOWN: 
		iNewPos		= (iOldPos + 1 > max) ? (max) : (iOldPos + 1);
		break;
	case SB_LINEUP:
		iNewPos		= (iOldPos - 1 < min) ? (min) : (iOldPos - 1);
		break;
	case SB_PAGEDOWN:
		iNewPos		= (iOldPos + 2 > max) ? (max) : (iOldPos + 2);
		break;
	case SB_PAGEUP:
		iNewPos		= (iOldPos - 2 < min) ? (min) : (iOldPos - 2);
		break;
	case SB_THUMBPOSITION:
	case SB_THUMBTRACK:
		iNewPos		= nPos;
		break;
	case SB_TOP:
		iNewPos		= min;
		break;
	}

	//	设置新位置
	if	(iOldPos	!= iNewPos)
	{
		int		iPicPerPage		= (3 == DispStyle) ? (2) : (DispStyle);

		m_iTopPicIndex	= (iNewPos - 1) * iPicPerPage + 1;
		DrawImg();
		SetCurrentPicture(m_iTopPicIndex);
		m_vs.SetScrollPos(iNewPos);
	}
}

/*
	By QXF, 2000-11-10
*/
BOOL
ImageProcess::DrawOnePicture(int iFrameIndex, int iPicIndex)
{
	if	(iFrameIndex < 1 || iFrameIndex > 9)	return	FALSE;
	if	(iPicIndex < 1)	return	FALSE;
	if	(iPicIndex > m_iPicCount)	iPicIndex	= 0;

	CRect	rcFrame;
	CDC		*pDC	= ff[iFrameIndex].GetDC();
	HDC		hDC		= pDC->GetSafeHdc();

	ff[iFrameIndex].GetClientRect(&rcFrame);

	m_pPic[iPicIndex]->DrawBMP(pDC, 0, 0, rcFrame.Width(), rcFrame.Height(), m_bStretch);
	if	(iPicIndex > 0)
	{
		m_pMark[iPicIndex]->SetTargetDCRect(rcFrame);
		m_pMark[iPicIndex]->SetTargetPICRect(rcFrame);
		DrawPicFrame(iPicIndex);
		m_pMark[iPicIndex]->ReDraw(hDC);
	}

	ReleaseDC(pDC);
	return	TRUE;
}

void
ImageProcess::DrawImg()
{
	int	iPicPerPage	= (3 == DispStyle) ? (2) : (DispStyle);
	int	i;

	for	(i = 1; i <= iPicPerPage; i++)
		DrawOnePicture(i, m_iTopPicIndex + i - 1);
}

void
ImageProcess::SetVs(int nPos)
{
	int		iOldPicIndex	= m_iCurPicIndex;
	int		iPicPerPage		= (3 == DispStyle) ? (2) : (DispStyle);

	m_iTopPicIndex		= (nPos - 1) * iPicPerPage + 1;
	SetCurrentPicture(m_iCurPicIndex);
//	m_iCurPicIndex		= m_iTopPicIndex;

/*
	if	(iOldPicIndex	!= m_iCurPicIndex)
	{
		CString		sCurPic;
	
		sCurPic.Format("%d", m_iCurPicIndex);
		GetDlgItem(IDC_CURPIC)->SetWindowText(sCurPic);
		DrawImg();
	}
*/
}

BOOL
ImageProcess::DestroyWindow() 
{
	CleanUp();

	if	(NULL != m_pPic[0])		delete	m_pPic[0];
	return CDialog::DestroyWindow();
}

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

void
ImageProcess::ChgGryWin(WPARAM wParm,LPARAM lParm)
{
	if	(NULL	== m_pCurrentPic)	return;
	if	(m_iPicCount	< 1)		return;
	
	m_pCurrentPic	= m_pPic[m_iCurPicIndex];
	m_pCurrentMark	= m_pMark[m_iCurPicIndex];
	
	m_pCurrentPic->ReLoad();

	if	(1	== lParm)
		m_pCurrentPic->ChgGryWinW(LOWORD(wParm), HIWORD(wParm));
	else
		m_pCurrentPic->ChgGryWin(LOWORD(wParm), HIWORD(wParm));
	
	DrawImg();
}

void
ImageProcess::ChgConBri(WPARAM wParm, LPARAM lParm)
{
	int	iContrast;		//	对比度
	int	iBright;		//	亮度

	if	(NULL == m_pCurrentPic || m_iPicCount < 1)	return;

	iContrast	= HIWORD(wParm) - 128;
	iBright		= LOWORD(wParm) - 128;

	m_pCurrentPic	= m_pPic[m_iCurPicIndex];
	m_pCurrentMark	= m_pMark[m_iCurPicIndex];

	//	重新装入图象
	m_pCurrentPic->ReLoad();
	m_pCurrentPic->ChgConBri(iContrast, iBright);

	DrawImg();
}

VOID
ImageProcess::PlayBackAvi(WPARAM wParm, LPARAM lParm)
{
	switch	(wParm)
	{
	case	-1:
		m_at.m_ShowAviArg.iControl	= CONTROL_STOP;
		((CBxtDlg*)AfxGetMainWnd())->imgpcs->Invalidate(TRUE);
		return;
	case	-2:
		m_at.m_ShowAviArg.iDelay	= lParm;
		return;
	case	-3:
		m_at.m_ShowAviArg.iControl	=
			(CONTROL_PAUSE	== m_at.m_ShowAviArg.iControl) ? (CONTROL_PLAY) : (CONTROL_PAUSE);
		return;
	default:
		CHAR	sAviFile[1000];
		CHAR	*sPathBuffer	= m_sPath.GetBuffer(m_sPath.GetLength());
		HWND	hAviWnd			= ff[1].GetSafeHwnd();
		CRect	rcFrame;

		ff[1].GetClientRect(&rcFrame);

		sprintf(sAviFile, "%sx%d.avi", sPathBuffer, 1);
		m_at.ShowAvi(sAviFile, hAviWnd, 0, 50,
			-1, -1,
			rcFrame.left + 2, rcFrame.top + 2, rcFrame.Width() - 4, rcFrame.Height() - 4,
			0, 0, -1, -1);
	}
}

VOID
ImageProcess::CleanUp()
{
	int		i;

	//	释放原来的所有图片和标记,第一次调用时 m_iPicCount 应设置为 0
	for	(i = 1; i <= m_iPicCount; i++)
	{
		m_pPic[i]->Close();
		m_pMark[i]->Close();

		delete			m_pPic[i];
		m_pPic[i]		= NULL;

		delete			m_pMark[i];
		m_pMark[i]		= NULL;
	}

	m_pCurrentPic		= NULL;
	m_pCurrentMark		= NULL;
	m_iPicCount			= 0;
}

BOOL
ImageProcess::SetCurrentPicture(int iIndex)
{
	int	iOldCurPicIndex	= m_iCurPicIndex;
	m_iCurPicIndex		= iIndex;

	if	(iOldCurPicIndex > 0)	DrawPicFrame(iOldCurPicIndex);
	if	(m_iCurPicIndex > 0)	DrawPicFrame(m_iCurPicIndex);

	m_pCurrentMark	= m_pMark[(iIndex > 0) ? (iIndex) : NULL];
	m_pCurrentPic	= m_pPic[(iIndex > 0) ? (iIndex) : NULL];

	if	(NULL != m_pCurrentMark)	m_pCurrentMark->SetActive();

	return	(TRUE);
}

BOOL
ImageProcess::DrawPicFrame(int iIndex)
{
	int			x0, y0, x1, y1;
	int			iFrameIndex	= iIndex - m_iTopPicIndex + 1;
	int			iLineWidth	= 3;
	int			iPicPerPage	= (3 == DispStyle) ? (2) : (DispStyle);

	if			(iFrameIndex < 1 || iFrameIndex > iPicPerPage)		return	(FALSE);

	HWND		hWnd		= ff[iFrameIndex].GetSafeHwnd();
	HDC			hDC			= ::GetDC(hWnd);;
	CRect		rect;

	::GetClientRect(hWnd, &rect);

	HGDIOBJ		hSelPen		= ::CreatePen(PS_SOLID, iLineWidth, RGB(255, 0, 0));
	HGDIOBJ		hLightPen	= ::CreatePen(PS_SOLID, iLineWidth, RGB(255, 255, 255));//192, 192, 192));
	HGDIOBJ		hDarkPen	= ::CreatePen(PS_SOLID, iLineWidth, RGB(255, 255, 255));// 64, 64, 64));
	HGDIOBJ		hOldPen		= NULL;
	BOOL		bIsSel		= (iIndex == m_iCurPicIndex && 1 != DispStyle);

	x0	= rect.left;
	y0	= rect.top;
	x1	= rect.right - iLineWidth;
	y1	= rect.bottom - iLineWidth;

	hOldPen		= ::SelectObject(hDC, (bIsSel) ? (hSelPen) : (hLightPen));
	::MoveToEx(hDC, x0, y1, NULL);
	::LineTo(hDC, x0, y0);
	::LineTo(hDC, x1, y0);
	if	(!bIsSel)	::SelectObject(hDC, hDarkPen);

	::LineTo(hDC, x1, y1);
	::LineTo(hDC, x0, y1);
	::SelectObject(hDC, hOldPen);

	::DeleteObject(hSelPen);
	::DeleteObject(hLightPen);
	::DeleteObject(hDarkPen);

	return	(TRUE);
}

//	根据窗口中点的位置判断图象框索引
int
ImageProcess::GetFrameIndex(CPoint dlgPoint)
{
	CPoint	pt	= dlgPoint;
	CRect	rcFrame;
	int		iFrameIndex;
	int		iFrameCount;

	ClientToScreen(&pt);
	iFrameCount	= (3 == DispStyle) ? (2) : (DispStyle);

	for		(iFrameIndex = 1; iFrameIndex <= iFrameCount; iFrameIndex++)
	{
		ff[iFrameIndex].GetWindowRect(&rcFrame);
		if	(rcFrame.PtInRect(pt))	return	(iFrameIndex);
	}

	return	(0);
}

void ImageProcess::PostNcDestroy() 
{
	// TODO: Add your specialized code here and/or call the base class
	CleanUp();

	if	(NULL != m_pPic[0])		delete	m_pPic[0];

	CDialog::PostNcDestroy();
}

⌨️ 快捷键说明

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