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

📄 usedlgs.cpp

📁 医学图象处理系统
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		if(abs(p2.x-p1.x)==0)
		{
			IsHorizontal = FALSE;
			dx = 0;
			dy = (p2.y-p1.y)>0 ? 1 : -1;
		}
		else if(abs(p1.y-p2.y)==0)
		{
			IsHorizontal = TRUE;
			dx = (p2.x-p1.x)>0 ? 1 : -1;
			dy = 0;
		}
		else
		{
			if(abs(p1.x-p2.x)>abs(p1.y-p2.y))
			{
				IsHorizontal = TRUE;
				dx    = (p2.x-p1.x)>0 ? 1 : -1;
				dy    = (double)(p2.y-p1.y)/(double)(abs(p2.x-p1.x));
			}
			else
			{
				IsHorizontal = FALSE;
				dy    = (p2.y-p1.y)>0 ? 1 : -1;
				dx    = (double)(p2.x-p1.x)/(double)(abs(p2.y-p1.y));
			}
		}
				
		double x=p1.x,  y=p1.y;
		if(m_pDoc->Image.m_wImageDepth==8)
		{
			LineGray = new int[PtNum];
			for(int i=0; i<PtNum ;i++)
			{
				if(IsHorizontal)
				{
					LineGray[i] = m_pDoc->Image.RowAddress[int(y+0.5)][int(x)];
				}
				else
				{
					LineGray[i] = m_pDoc->Image.RowAddress[int(y)][int(x+0.5)];
				}
				x += dx;
				y += dy; 
			}
		}
		else 
		{
			LineRed   = new int[PtNum];
			LineGreen = new int[PtNum];
			LineBlue  = new int[PtNum];
			RGBTRIPLE temp;
			for(int i=0; i<PtNum ;i++)
			{
				if(IsHorizontal)
				{
					temp = m_pDoc->Image.GetRGBPixel(int(x), int(y+0.5));
					LineRed[i]   = temp.rgbtRed;
					LineGreen[i] = temp.rgbtGreen;
					LineBlue[i]  = temp.rgbtBlue;
				}
				else
				{
					temp = m_pDoc->Image.GetRGBPixel(int(x+0.5), int(y));
					LineRed[i]   = temp.rgbtRed;
					LineGreen[i] = temp.rgbtGreen;
					LineBlue[i]  = temp.rgbtBlue;
				}
				x += dx;
				y += dy; 
			}
		}
	}
	CRect rect;
	GetWindowRect(&rect);
	SetWindowPos(NULL,rect.left,rect.top,PtNum+50,Height+40,SWP_NOACTIVATE);
	CButton *PButton = (CButton*) GetDlgItem(IDOK);
	PButton->GetWindowRect(&rect);
	GetParent()->ScreenToClient(&rect);
	PButton->SetWindowPos(NULL,PtNum+10,Height-50,rect.Width(),rect.Height(),SWP_NOACTIVATE);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CLineGrayInfoDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	int i,orgPtx = 5, orgy = Height+10;
 
	if(LineGray!=NULL||(LineRed!=NULL && LineGreen!=NULL && LineBlue!=NULL))
	{
		dc.MoveTo(orgPtx,  orgy);
		dc.LineTo(orgPtx,  orgy - Height -1);
		dc.LineTo(orgPtx + PtNum + 6, orgy - Height -1);

		dc.MoveTo(orgPtx,orgy);
		dc.LineTo(orgPtx + PtNum + 6, orgy);

		dc.MoveTo(orgPtx + PtNum +1,  orgy);
		dc.LineTo(orgPtx + PtNum +1,  orgy - Height -1);

		dc.SetTextAlign(TA_CENTER);
		dc.SetBkMode(TRANSPARENT);
		dc.TextOut(orgPtx + PtNum + 20, orgy - 10,         "0");
		dc.TextOut(orgPtx + PtNum + 20, orgy - Height-8, "255"); 

		if(m_pDoc->Image.m_wImageDepth==8&&LineGray!=NULL)
		{
			dc.MoveTo(orgPtx,orgy - LineGray[0]/2);
			for(i=1; i<PtNum ;i++)
			{		
				dc.LineTo(orgPtx+i,orgy - LineGray[i]/2);
			} 
		}
		else 
		{
			//画红色分量的直方图
			CPen  RedPen(PS_SOLID,1,RGB(255,0,0));
			CPen *pOldPen = dc.SelectObject(&RedPen);
			dc.MoveTo(orgPtx,orgy - LineRed[0]/2);
			for(i=1; i<PtNum ;i++)
			{		
				dc.LineTo(orgPtx+i,orgy - LineRed[i]/2);
			} 
			dc.SelectObject(pOldPen);
			//画绿色分量的直方图
			CPen  GreenPen(PS_SOLID,1,RGB(0,255,0));
			pOldPen = dc.SelectObject(&GreenPen);
			dc.MoveTo(orgPtx,orgy - LineGreen[0]/2);
			for(i=1; i<PtNum ;i++)
			{		
				dc.LineTo(orgPtx+i,orgy - LineGreen[i]/2);
			} 
			dc.SelectObject(pOldPen);
			//画蓝色分量的直方图
			CPen  BluePen(PS_SOLID,1,RGB(0,0,255));
			pOldPen = dc.SelectObject(&BluePen);
			dc.MoveTo(orgPtx,orgy - LineBlue[0]/2);
			for(i=1; i<PtNum ;i++)
			{		
				dc.LineTo(orgPtx+i,orgy - LineBlue[i]/2);
			} 
			dc.SelectObject(pOldPen);
		}
	}
}

void CLineGrayInfoDlg::OnOK() 
{
	int Answer = AfxMessageBox("你是否愿意将线信息存盘吗", MB_OKCANCEL|MB_ICONQUESTION );
	if(Answer==IDOK)
	{
		CString filt = " Line Image(TXT)|*.txt|(*.txt)||";
		CFileDialog  dlgFile(false,"*.BMP","", OFN_HIDEREADONLY,filt,NULL);
		dlgFile.m_ofn.Flags|=OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT;
		if(dlgFile.DoModal()==IDOK)
		{
			FILE *wf;
			wf = fopen(dlgFile.GetPathName(), "w");
			fprintf(wf, "%d\n", PtNum);
			for(int i=0; i<PtNum; i++)
				fprintf(wf, "%4d %4d\n", i, LineGray[i]);
			fclose(wf);
		}
	}
	CDialog::OnOK();
}
void CLineGrayInfoDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	// TODO: Add your message handler code here
	if(LineGray != NULL) delete []LineGray; 
	if(LineGreen!= NULL) delete []LineGreen; 
	if(LineRed  != NULL) delete []LineRed; 
	if(LineBlue != NULL) delete []LineBlue; 
}
/////////////////////////////////////////////////////////////////////////////
// CSusanPramDlg dialog

CSusanPramDlg::CSusanPramDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CSusanPramDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSusanPramDlg)
	m_bt = 20;
	m_dt = 4.0;
	//}}AFX_DATA_INIT
}

void CSusanPramDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSusanPramDlg)
	DDX_Text(pDX, IDC_BT, m_bt);
	DDV_MinMaxInt(pDX, m_bt, 1, 50);
	DDX_Text(pDX, IDC_DT, m_dt);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CSusanPramDlg, CDialog)
	//{{AFX_MSG_MAP(CSusanPramDlg)
		// NOTE: the ClassWizard will add message map macros here
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSusanPramDlg message handlers
/////////////////////////////////////////////////////////////////////////////
// CMaskSizeDlg dialog
CMaskSizeDlg::CMaskSizeDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMaskSizeDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMaskSizeDlg)
	m_MaskSize = 5;
	//}}AFX_DATA_INIT
}

void CMaskSizeDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMaskSizeDlg)
	DDX_Control(pDX, IDC_SPIN1, m_Spin1);
	DDX_Text(pDX, IDC_MaskSize, m_MaskSize);
	DDV_MinMaxInt(pDX, m_MaskSize, 3, 151);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMaskSizeDlg, CDialog)
	//{{AFX_MSG_MAP(CMaskSizeDlg)
	ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN1, OnDeltaposSpin1)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMaskSizeDlg message handlers
BOOL CMaskSizeDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();

	m_Spin1.SetRange( 3, 151 );
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CMaskSizeDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
	m_MaskSize += 2*pNMUpDown->iDelta;
	if(m_MaskSize>151) 
	{
		m_MaskSize = 151;
	}
	else if(m_MaskSize<3) 
	{
		m_MaskSize = 3;
	}
	UpdateData(FALSE);
	*pResult = 0;
}


/////////////////////////////////////////////////////////////////////////////
// CManualBinaryDlg dialog


CManualBinaryDlg::CManualBinaryDlg(CImageLABDoc *_pDoc,CWnd* pParent /*=NULL*/)
	: CDialog(CManualBinaryDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CManualBinaryDlg)
	m_BinaryType = 0;
	m_Threshold = 125;
	//}}AFX_DATA_INIT
	InitOk = FALSE;
	m_pDoc = _pDoc;
	dashPen.CreatePen(PS_DOT,1,RGB(0,255,255));
	BlackPen.CreatePen(PS_SOLID,1,RGB(0,0,0));
	StartPt.x = 10;	// the ORIGINAL point.
	StartPt.y = 110;
	triangleTopPoint.x = StartPt.x+m_Threshold;
	triangleTopPoint.y = StartPt.y+1;

	memset(HistogramR,0,256*sizeof(int));
	
	pView = m_pDoc->m_pView;
        
	if(pView!=NULL)
	{
		m_pDoc = pView->GetDocument();
		if(m_pDoc->Image.m_lpDibArray!=NULL)
		{
			pView->GetSelectArea(p1, p2);
			if(pView->DashRectDrawed)
			{
				 if(m_pDoc->Image.m_wImageDepth==8)
				 {
					 for(long j=p1.y;j<p2.y;j++)
					 {
						 for(long i=p1.x;i<p2.x;i++)
						 {
							 HistogramR[m_pDoc->Image.GetGrayV(i, j)]++;
						 }
					 }
				 }
			}
			else
			{
				 if(m_pDoc->Image.m_wImageDepth==8)
				 {
					 BYTE *temp = m_pDoc->Image.m_lpDibArray;
					 for(int i=0;i<m_pDoc->Image.m_ImageSize;i++)
					 {
						 HistogramR[*temp++]++;
					 }
				 }
			}
		}
	}
	MaxFrequencyR = 0;
	for(int i=0;i<256;i++)
	{
		if(MaxFrequencyR<HistogramR[i]) MaxFrequencyR = HistogramR[i];
	}
}

void CManualBinaryDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CManualBinaryDlg)
	DDX_Control(pDX, IDC_SLIDER1, m_Slide1);
	DDX_Control(pDX, IDC_SPIN1, m_Spin1);
	DDX_Radio(pDX, IDC_RADIO1, m_BinaryType);
	DDX_Text(pDX, IDC_EDIT1, m_Threshold);
	DDV_MinMaxByte(pDX, m_Threshold, 0, 255);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CManualBinaryDlg, CDialog)
	//{{AFX_MSG_MAP(CManualBinaryDlg)
	ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
	ON_WM_HSCROLL()
	ON_WM_PAINT()
	ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
	ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
	ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
	ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
	ON_WM_SETCURSOR()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CManualBinaryDlg message handlers
void CManualBinaryDlg::OnChangeEdit1() 
{
	if(!InitOk) return;	
	CClientDC dc(this);
	CPoint    tmpP;

	m_Threshold = (BYTE) GetDlgItemInt(IDC_EDIT1,NULL,FALSE);
	CSliderCtrl* pSlider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
	pSlider->SetPos(m_Threshold);

	pOldPen = dc.SelectObject(&dashPen);
	dc.SetROP2(R2_XORPEN);
	
	dc.MoveTo(triangleTopPoint);
	tmpP.x = triangleTopPoint.x - 3;
	tmpP.y = triangleTopPoint.y + 5;
	dc.LineTo(tmpP);
	tmpP.x += 6;
	dc.LineTo(tmpP);
	dc.LineTo(triangleTopPoint);

	triangleTopPoint.x = m_Threshold + StartPt.x;

	// draw triangle (4*3)
	dc.MoveTo(triangleTopPoint);
	tmpP.x = triangleTopPoint.x - 3;
	tmpP.y = triangleTopPoint.y + 5;
	dc.LineTo(tmpP);
	tmpP.x += 6;
	dc.LineTo(tmpP);
	dc.LineTo(triangleTopPoint);

	int total=0;
	int NowTotal=0;
	for(int i=0;i<255;i++)
	{
		total += HistogramR[i];
		if(i<=m_Threshold) NowTotal+= HistogramR[i];
	}
	CString msg;
	msg.Format(" %8.3f ",(double)NowTotal/(double)total);
	SetDlgItemText(IDC_PROP,msg);
	
	dc.SelectObject(pOldPen);
	if(pView!=NULL)
	{
		if(m_pDoc->Image.m_lpDibArray!=NULL&&m_pDoc->Image.m_wImageDepth==8)
		{
			m_pDoc->Image.ImgSwap();
			m_pDoc->Image.BackUp();
			if(pView->DashRectDrawed)
			{
				m_pDoc->Image.Binary2(m_Threshold,m_BinaryType,p1,  p2);
				CRect InvalRect;
				InvalRect.left   = p1.x - pView->ScrollOrgPt.x;
				InvalRect.top    = p1.y - pView->ScrollOrgPt.y;
				InvalRect.right  = p2.x+1 - pView->ScrollOrgPt.x;
				InvalRect.bottom = p2.y+1 - pView->ScrollOrgPt.y;
				pView->InvalidateRect(InvalRect, FALSE);
			}
			else
			{
				m_pDoc->Image.Binary2(m_Threshold,m_BinaryType);
				pView->Invalidate(FALSE);
			}
		}
	}
}

BOOL CManualBinaryDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	m_Spin1.SetRange( 0, 255 );

	m_Threshold = 125;
	m_Slide1.SetRange(0, 255);
	m_Slide1.SetPos(m_Threshold);
	InitOk = TRUE;
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CManualBinaryDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	CSliderCtrl* pSlider = (CSliderCtrl*)pScrollBar;
	if(pSlider!= NULL)
	{
		m_Threshold = pSlider->GetPos();
		SetDlgItemInt(IDC_EDIT1,m_Threshold,FALSE);
	}
	CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CManualBinaryDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting

	pOldPen = dc.SelectObject(&BlackPen);
	dc.SetROP2(R2_BLACK);

	CPoint tmpP(StartPt.x+255,StartPt.y+1);
	dc.MoveTo(StartPt.x,StartPt.y+1);
	dc.LineTo(tmpP);
	dc.MoveTo(StartPt.x,StartPt.y+2);
	dc.LineTo(tmpP.x,   tmpP.y+1);

	// draw triangle (4*3)
	dc.SelectObject(&dashPen);
	dc.SetROP2(R2_XORPEN);
	dc.MoveTo(triangleTopPoint);
	tmpP.x = triangleTopPoint.x-3;
	tmpP.y = triangleTopPoint.y+5;
	dc.LineTo(tmpP);
	tmpP.x += 6;
	dc.LineTo(tmpP);
	dc.LineTo(triangleTopPoint);

	dc.SetBkMode(TRANSPARENT);
	dc.TextOut(StartPt.x,StartPt.y+2,"0");
	dc.TextOut(StartPt.x+240,StartPt.y+2,"255");
	//draw histogram picture
	
	dc.SetROP2(R2_COPYPEN);
	CPoint BottomP = StartPt;

	double scale =  100/(double)MaxFrequencyR;
	dc.SelectObject(&BlackPen);			
	for(WORD i = 0; i < 256; i++)
	{
		tmpP.x = BottomP.x;
		tmpP.y = BottomP.y - int(HistogramR[i]*scale);
		dc.MoveTo(BottomP);
		dc.LineTo(tmpP);
		BottomP.x++;
	}
	dc.SelectObject(pOldPen);
}
void CManualBinaryDlg::OnOK() 
{
	OnChangeEdit1();
	CDialog::OnOK();
}
void CManualBinaryDlg::OnRadio1() 
{
	m_BinaryType = 0;
}

void CManualBinaryDlg::OnRadio2() 
{
	m_BinaryType = 1;
}

void CManualBinaryDlg::OnRadio3() 
{
	m_BinaryType = 2;

⌨️ 快捷键说明

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