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

📄 rightbar.cpp

📁 医学图象处理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		
		if(CursorInRedRect&&LButtonDown)// 开始拖动红框
		{
			int dx = point.x - StartPt.x;
			int dy = point.y - StartPt.y;

			RedRect.OffsetRect(dx, dy);
			if(!IsImageFillStatic)
			{
				DrawRedRect(RedRect);
			}
			StartPt = point;
		}
	}
	else
	{
		CDialogBar::OnMouseMove(nFlags, point);
	}
}

void CRightBar::PostNcDestroy() 
{
	if(bTempDCCreate && bTempBMPCreate)
	{
		tempDC.SelectObject(pOldbmp);
		tempDC.DeleteDC();
		bTempDCCreate = false;
		bTempBMPCreate = false;
	}
	CDialogBar::PostNcDestroy();
}

BOOL CRightBar::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	if(nHitTest == HTCLIENT && IsOpenImage)
	{		 
		if(CursorInImage)
		{
			if(CursorInRedRect)
			{
			 if(LButtonDown) 
				 SetCursor( AfxGetApp()->LoadCursor(IDC_HANDGRABED));
			 else
				 SetCursor( AfxGetApp()->LoadCursor(IDC_HANDWANTGRAB));	
			 return true;
			}
			SetCursor( AfxGetApp()->LoadCursor(IDC_HANDPOINT));
			return true;
		}
		switch(pWnd->GetDlgCtrlID())
		{
		case  IDC_SLIDER_BRIGHTNESS:
		case  IDC_SLIDER_CONTRAST:
			SetCursor( AfxGetApp()->LoadCursor(IDC_HANDWANTGRAB));
			return TRUE;
		}			
	}
	return CDialogBar::OnSetCursor(pWnd, nHitTest, message);
}

void CRightBar::DrawRedRect(CRect RedRect)
{
	int dx, dy;
	if(RedRect.left<ImageRect.left+1)
	{
		dx = ImageRect.left+1 - RedRect.left;
		RedRect.OffsetRect(dx, 0);				
	}
	else if(RedRect.right>ImageRect.right)
	{   
		dx = ImageRect.right - RedRect.right;
		RedRect.OffsetRect(dx, 0);
	}

	if(RedRect.top<ImageRect.top+1)
	{
		dy = ImageRect.top+1 - RedRect.top;
		RedRect.OffsetRect(0, dy);
	}
	else if(RedRect.bottom>ImageRect.bottom)
	{
		dy = ImageRect.bottom - RedRect.bottom;
		RedRect.OffsetRect(0, dy);
	}

	CClientDC dc(this);
	dc.StretchBlt(ImageRect.left, ImageRect.top, ImageRect.Width()+1, ImageRect.Height()+1,
			      &tempDC,
				  0, 0,	 ImageRect.Width()+1, ImageRect.Height()+1, 
				  SRCCOPY);

	pOldPen = dc.SelectObject(&RedPen);
	dc.SetROP2(R2_COPYPEN);
	dc.SelectStockObject(NULL_BRUSH);
	dc.Rectangle(RedRect);
	dc.SelectObject(pOldPen);

	CPoint SCT;
	SCT.x = int( (float)(RedRect.left - ImageRect.left-1) /(float)ImageRect.Width()*TVS.cx+0.5 );
	SCT.y = int( (float)(RedRect.top - ImageRect.top-1) /(float)ImageRect.Height()*TVS.cy+0.5 );

	CFrameWnd* pFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
	CImageLABView* pView = (CImageLABView*)pFrameWnd->GetActiveFrame()->GetActiveView();
	
	if(pView->fShowScale > 1)
	{
		int ImageSclae = int(pView->fShowScale);
		SCT.x = (SCT.x+ ImageSclae- 1)/ImageSclae*ImageSclae;
		SCT.y = (SCT.y+ ImageSclae- 1)/ImageSclae*ImageSclae;
	}

    if(pView->IsKindOf(RUNTIME_CLASS(CImageLABView)))
	{
		pView->ScrollToPosition(SCT);
		pView->ScrollOrgPt = SCT;
	}
}
LRESULT CRightBar::HandleInitDialog(WPARAM wparam, LPARAM lparam)
{
	slider_B = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_BRIGHTNESS);
	slider_C = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_CONTRAST);

	m_Bright   = MidBright;
	m_Contrast = RangeContrast;

	slider_B->SetRange(0, RangeBright);
	slider_B->SetPos(m_Bright);
	slider_B->SetTic(0);
	slider_B->SetTic(25);
	slider_B->SetTic(50);
	slider_B->SetTic(75);
	slider_B->SetTic(100);
	slider_B->SetTic(125);
	slider_B->SetTic(151);
	slider_B->SetTic(177);
	slider_B->SetTic(203);
	slider_B->SetTic(229);
	slider_B->SetTic(255);

	slider_C->SetRange(0, RangeContrast+ RangeContrast);
	slider_C->SetPos(RangeContrast);
	slider_C->SetTic(0);
	slider_C->SetTic(13);
	slider_C->SetTic(25);
	slider_C->SetTic(38);
	slider_C->SetTic(50);
	slider_C->SetTic(63);
	slider_C->SetTic(75);
	slider_C->SetTic(88);
	slider_C->SetTic(102);
	slider_C->SetTic(114);
	slider_C->SetTic(127);

	lpClip = Clip + 200;
	memset(Clip, 255, 800);
	for(int i= 0; i< 200; i++)
	{
		Clip[i] = 0;		
	}
	for(i= 0; i< 256; i++)
	{
		lpClip[i] = BYTE(i);		
	}

	return TRUE;
}

void CRightBar::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	CSliderCtrl* pSlider = (CSliderCtrl*)pScrollBar;
	slider_B = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_BRIGHTNESS);
	slider_C = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_CONTRAST);

	CFrameWnd* pFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
	CImageLABView* pView = (CImageLABView*)pFrameWnd->GetActiveFrame()->GetActiveView();
	
	if( pView == NULL ) return;
	
	CImageLABDoc *m_pDoc = pView->GetDocument();
	if( m_pDoc == NULL || m_pDoc->Image.m_lpDibArray == NULL ) return;

	int ImageSize = m_pDoc->Image.m_ImageSize;
	BYTE *lpImageStart, *lpImageEnd, *lpImageBakup;
	if( m_pDoc->Image.m_lpDibArrayBuff == NULL ) 
		m_pDoc->Image.BackUp();


	if(pSlider == slider_B)
	{
		lpImageStart = m_pDoc->Image.m_lpDibArray;
		lpImageEnd   = m_pDoc->Image.m_lpDibArray + ImageSize;
		lpImageBakup = m_pDoc->Image.m_lpDibArrayBuff;

		m_Bright = pSlider->GetPos();
		m_pDoc->Image.m_Bright = m_Bright;
		m_AddB	 = m_Bright - MidBright;
		for(BYTE* NowPixel= lpImageStart; NowPixel< lpImageEnd; NowPixel++, lpImageBakup++)
			*NowPixel = *(lpClip + *lpImageBakup + m_AddB);
		pView->Invalidate(false);
	}
	else if(pSlider == slider_C)
	{
		lpImageStart = m_pDoc->Image.m_lpDibArrayBuff;
		lpImageEnd   = m_pDoc->Image.m_lpDibArrayBuff + ImageSize;

		m_Contrast = pSlider->GetPos();
		m_pDoc->Image.m_Contrast = m_Bright;
		m_AddB	   = m_Contrast - RangeContrast;
		int max_r = *lpImageStart++;
		int min_r = max_r;				

		for(BYTE* NowPixel= lpImageStart; NowPixel< lpImageEnd; NowPixel++)
		{
			if ( *NowPixel > max_r )
			   max_r = *NowPixel;
			else if ( *NowPixel < min_r )
			   min_r = *NowPixel;
		}
		int GrayRange = max_r - min_r;		
		if( GrayRange == 0 ) return;

		double a, b, fTemp;
		if( m_AddB > 0 )
		{
			a = min_r - (double)(min_r + OverRange)* m_AddB/ OverRange;
			b = (double)(255 + OverRange - max_r)* m_AddB/ OverRange + max_r;
		}
		else
		{
			int mid = GrayRange / 2;
			a = min_r -  (double) mid* m_AddB/ (double)OverRange;
			b = max_r +  (double) mid* m_AddB/ (double)OverRange;
			if( fabs(b-a)< 2 )
			{
				a -= 1; 
				b += 1;
			}
		}

		double  ratio = (double)(b- a)/(double)(max_r - min_r);
		// -----建立查找表-----
		BYTE LUT[256];
		for(int i= min_r; i<256; i++)
		{
			fTemp  = (i- min_r)* ratio + a + 0.5;
			if( fTemp < 0 )
				LUT[i] = 0;
			else if( fTemp < 255 )
				LUT[i] = BYTE( fTemp );
			else
				LUT[i] = 255;
		}
		// -----进行线性变换-----
		lpImageStart = m_pDoc->Image.m_lpDibArray;
		lpImageEnd   = m_pDoc->Image.m_lpDibArray + ImageSize;
		lpImageBakup = m_pDoc->Image.m_lpDibArrayBuff;
		for(NowPixel= lpImageStart; NowPixel< lpImageEnd; NowPixel++, lpImageBakup++)
		{
			*NowPixel = LUT[ *lpImageBakup ]; 
		}
		pView->Invalidate(false);
	}
	CDialogBar::OnHScroll(nSBCode, nPos, pScrollBar);
}

void CRightBar::ButtonReset() 
{
	slider_B = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_BRIGHTNESS);
	slider_C = (CSliderCtrl *)GetDlgItem(IDC_SLIDER_CONTRAST);
	if( !slider_B->IsWindowEnabled() ) return;

	CFrameWnd* pFrameWnd = STATIC_DOWNCAST(CFrameWnd, AfxGetMainWnd());
	CImageLABView* pView = (CImageLABView*)pFrameWnd->GetActiveFrame()->GetActiveView();
	
	if( pView == NULL ) return;
	
	CImageLABDoc *m_pDoc = pView->GetDocument();
	if( m_pDoc == NULL || m_pDoc->Image.m_lpDibArray == NULL ) return;

	int ImageSize = m_pDoc->Image.m_ImageSize;

	m_Bright   = MidBright;
	m_Contrast = RangeContrast;
	slider_B->SetPos(m_Bright);
	slider_C->SetPos(m_Contrast);

	m_pDoc->Image.m_Contrast = -1;
	m_pDoc->Image.m_Bright   = -1;
	m_pDoc->Image.ImgSwap();
	m_pDoc->Image.BackUp();
	pView->Invalidate(false);	
}

⌨️ 快捷键说明

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