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

📄 rightbar.cpp

📁 医学图象处理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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);	

⌨️ 快捷键说明

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