www.pudn.com > 医学图像处理示例源代码.rar > RightBar.cpp


// RightBar.cpp : implementation file 
 
#include "stdafx.h" 
#include "ImageLAB.h" 
#include "RightBar.h" 
#include "AllImage.h" 
#include "ImageLABDoc.h" 
#include "ImageLABView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
extern double *ShowScaleType; 
 
#define RangeBright		255 
#define MidBright		127 
#define RangeContrast   50 
#define OverRange       50 
///////////////////////////////////////////////////////////////////////////// 
// CRightBar dialog 
 
CRightBar::CRightBar(CWnd* pParent /*=NULL*/) 
{ 
	//{{AFX_DATA_INIT(CRightBar) 
	m_Bright = 0; 
	m_Contrast = 0; 
	//}}AFX_DATA_INIT 
	bTempDCCreate = IsOpenImage = bTempBMPCreate = false; 
	IsImageFillStatic = IsButtonReset = false; 
	CursorInRedRect = CursorInImage = CursorGrab = LButtonDown = false; 
	RedPen.CreatePen(PS_SOLID, 2, RGB(255, 0, 0)); 
} 
 
BEGIN_MESSAGE_MAP(CRightBar, CDialogBar) 
	//{{AFX_MSG_MAP(CRightBar) 
	ON_WM_PAINT() 
	ON_WM_MOUSEMOVE() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_WM_SETCURSOR() 
	ON_MESSAGE(WM_INITDIALOG, HandleInitDialog) 
	ON_WM_HSCROLL() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CRightBar message handlers 
void CRightBar::DrawMiniImage() 
{ 
	if(!IsWindowVisible() )  
	{ 
		TRACE("The window is not visible , so I return !!!\n"); 
		return; 
	} 
	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(); 
	CStatic* pic = (CStatic*)GetDlgItem(IDC_MINIIMAGE); 
	CClientDC dc(pic); 
	pic->GetClientRect(&rect); 
	 
	if( pView != NULL ) 
	{ 
		CImageLABDoc *m_pDoc = pView->GetDocument(); 
		IsOpenImage = true; 
		if( m_pDoc != NULL && m_pDoc->Image.m_lpDibArray != NULL ) 
		{ 
			imgW = (int)m_pDoc->Image.m_ImageWidth; 
			imgH = (int)m_pDoc->Image.m_ImageHeight;			 
			BigImage = (imgW > 800) || (imgH > 800); 
 
			int ShowW = rect.Width()  - 8; 
			int ShowH = rect.Height() - 8; 
			int CenterPicx = rect.Width()/ 2; 
			int CenterPicy = rect.Height()/ 2; 
			float w = (float)imgW; 
            float h = (float)imgH; 
            float ratio1 = w/ h; 
			float ratio2 = (float)ShowW/ (float)ShowH; 
			if( ratio1 > ratio2 ) 
			{ 
				h = h * ShowW / w; 
				w = (float)ShowW; 
			} 
			else 
			{				 
				w = w * ShowH / h; 
				h = (float)ShowH; 
			} 
			//获得导游图像再 pic 控件上的位置(按比例计算得到) 
			ImageRect.left   = CenterPicx - int(w/2); 
			ImageRect.right  = CenterPicx + int(w/2); 
			ImageRect.top    = CenterPicy - int(h/2); 
            ImageRect.bottom = CenterPicy + int(h/2);			 
			 
			if(BigImage && m_pDoc->Image.m_wImageDepth>=8 ) //如果图像较大的话,则建立小的微缩图像写入pic 控件DC中 
			{ 
				if((m_pDoc->SmallImage.m_lpDibArray == NULL) || (OldBigFileName!=m_pDoc->ImageFileName)) 
				{ 
					m_pDoc->SmallImage.CreateMicroImg(m_pDoc->Image, ImageRect.Width() ,ImageRect.Height()); 
					m_pDoc->SmallImage.ShowCurrentImage(&dc, ImageRect); 
					OldBigFileName = m_pDoc->ImageFileName; 
				} 
				m_pDoc->SmallImage.ShowCurrentImage(&dc, ImageRect); 
			} 
			else        //否则将原图像写入pic 控件DC中 
			{ 
				m_pDoc->Image.ShowCurrentImage(&dc, ImageRect);				 
			} 
			 
			if(!bTempDCCreate) //建立临时的DC 
			{ 
				tempDC.CreateCompatibleDC(&dc); 
				tempDC.SetStretchBltMode(COLORONCOLOR);  
				bTempDCCreate = true;						 
			} 
			if(!bTempBMPCreate) //建立临时的BMP 
			{ 
				bitmap.CreateCompatibleBitmap(&dc, rect.Width(), rect.Height()); 
			    pOldbmp = tempDC.SelectObject(&bitmap);	 
				bTempBMPCreate = true; 
			} 
			//将pic 控件DC的内容写入临时的DC中 
			tempDC.StretchBlt(0, 0, ImageRect.Width()+1, ImageRect.Height()+1, 
			                  &dc,   
							  ImageRect.left, ImageRect.top, ImageRect.Width()+1, ImageRect.Height()+1,  
							  SRCCOPY); 
			//bitmap.DeleteObject(); 
 
			pView->GetClientRect(&rect);			 
			TVS = pView->ScrollSize; 
			if(rect.Height()==TVS.cy&&rect.Width()>TVS.cx) rect.right = rect.left + TVS.cx; 
			CPoint VSPt = pView->ScrollOrgPt; 
			int iRedRectWidth  = int((float)rect.Width()/ (float)TVS.cx* ImageRect.Width()); 
			int iRedRectheight = int((float)rect.Height()/ (float)TVS.cy* ImageRect.Height()); 
			RedRect.left   = int((float)VSPt.x/ (float)TVS.cx* ImageRect.Width() ) + ImageRect.left+1;   
			RedRect.top    = int((float)VSPt.y/ (float)TVS.cy* ImageRect.Height() ) + ImageRect.top+1; 
			RedRect.right  = RedRect.left + iRedRectWidth-1; 
			RedRect.bottom = RedRect.top + iRedRectheight-1; 
			if(RedRect.Width()<4)  
			{ 
				RedRect.right += 4; 
				if(RedRect.right > ImageRect.right)  
				{ 
					RedRect.right = ImageRect.right; 
					RedRect.left  = RedRect.right - 4;  
				} 
				 
			} 
			if(RedRect.Height()<4)  
			{ 
				RedRect.bottom += 4; 
				if(RedRect.bottom > ImageRect.bottom)  
				{ 
					RedRect.bottom = ImageRect.bottom; 
					RedRect.top    = RedRect.top - 4;  
				} 
			} 
			IsImageFillStatic = abs(ImageRect.Width()-RedRect.Width())<3 && 
								abs(ImageRect.Height()-RedRect.Height())<3; 
			//绘制红色方框		 
			pOldPen = dc.SelectObject(&RedPen); 
			dc.SetROP2(R2_COPYPEN); 
			dc.SelectStockObject(NULL_BRUSH); 
			dc.Rectangle(RedRect);			 
			dc.SelectObject(pOldPen); 
 
			CPoint p1(0,0),p2(0,0); 
			ClientToScreen (&p1); 
			pic->ClientToScreen (&p2); 
			ImageOffset.cx= p2.x - p1.x; 
			ImageOffset.cy= p2.y - p1.y; 
			RedRect.OffsetRect(ImageOffset); 
			ImageRect.OffsetRect(ImageOffset); 
			rect.OffsetRect(ImageOffset); 
		} 
	 
		if( !pView->bFreeze ) 
		{ 
			slider_C->EnableWindow(false); 
			slider_B->EnableWindow(false); 
			IsButtonReset = false; 
		} 
		else 
		{ 
			if( !slider_C->IsWindowEnabled() ) 
			{ 
				slider_C->EnableWindow(true); 
				IsButtonReset = true; 
			} 
			if( m_pDoc->Image.m_Contrast < 0 ) 
			{ 
				slider_C->SetPos(RangeContrast); 
			} 
			else 
			{ 
				slider_C->SetPos(m_pDoc->Image.m_Contrast); 
			} 
 
			if( !slider_B->IsWindowEnabled() ) 
			{ 
				slider_B->EnableWindow(true); 
			} 
			if( m_pDoc->Image.m_Bright < 0 ) 
			{ 
				slider_B->SetPos(MidBright); 
			} 
			else 
			{ 
				slider_B->SetPos(m_pDoc->Image.m_Bright); 
			} 
		} 
	} 
	else 
	{ 
		IsOpenImage = false; 
		dc.SetBkMode(TRANSPARENT); 
		dc.SetTextColor(RGB(255,0,0)); 
		rect.top +=30;  
		dc.DrawText("湖南华美安全设备公司\n胶片管理系统", rect, DT_CENTER); 
		slider_C->EnableWindow(false); 
		slider_B->EnableWindow(false); 
		IsButtonReset = false; 
	} 
} 
 
void CRightBar::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting	 
	DrawMiniImage(); 
} 
 
void CRightBar::OnLButtonDown(UINT nFlags, CPoint point)  
{	 
	LButtonDown = true; 
	if(IsOpenImage && rect.PtInRect(point)) 
	{  
		if(RedRect.PtInRect(point)) 
		{ 
			CursorInRedRect = true; 
			StartPt = point; 
			SetCursor(AfxGetApp()->LoadCursor(IDC_HANDGRABED)); 
		} 
		else 
		{ 
			CursorInRedRect = false;  
			if(ImageRect.PtInRect(point)) 
			{ 
				CursorInImage = true; 
				SetCursor( AfxGetApp()->LoadCursor(IDC_HANDPOINT)); 
			} 
			else 
			{ 
				CursorInImage = false; 
			} 
		} 
 
		if(CursorInImage&&!CursorInRedRect) 
		{ 
			int dx = point.x - (RedRect.left + RedRect.right)/2; 
			int dy = point.y - (RedRect.top + RedRect.bottom)/2; 
			RedRect.OffsetRect(dx, dy); 
			if(!IsImageFillStatic) 
				DrawRedRect(RedRect); 
		} 
	} 
	else 
		CDialogBar::OnLButtonDown(nFlags, point); 
} 
 
void CRightBar::OnLButtonUp(UINT nFlags, CPoint point)  
{ 
	LButtonDown = false; 
	if(IsOpenImage && rect.PtInRect(point)) 
	{  
		if(RedRect.PtInRect(point)) 
		{ 
			CursorInRedRect = true; 
			::SetCursor( ((CImageLABApp *)AfxGetApp())->LoadCursor(IDC_HANDWANTGRAB)); 
		} 
	} 
	CDialogBar::OnLButtonUp(nFlags, point);	 
} 
 
void CRightBar::OnMouseMove(UINT nFlags, CPoint point)  
{ 
	if(IsOpenImage && rect.PtInRect(point)) 
	{  
		CursorInRedRect = RedRect.PtInRect(point); 
		CursorInImage   = ImageRect.PtInRect(point);	 
		 
		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.leftImageRect.right) 
	{    
		dx = ImageRect.right - RedRect.right; 
		RedRect.OffsetRect(dx, 0); 
	} 
 
	if(RedRect.topImageRect.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);	 
}