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

📄 cedlg.cpp

📁 又VC++实现的基于TWAIN的扫描仪图像输入处理软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			fGamma=log(NewNod.y/255.0)/log(NewNod.x/255.0);

			m_PointList.RemoveAll();
			NewNod.x=0;
			NewNod.y=0;
			m_PointList.AddTail(NewNod);
			for(i=1;i<26;i++)
			{
			   NewNod.x=10*i;
			   NewNod.y=(int)(255*pow(NewNod.x/255.0,fGamma));
			   m_PointList.AddTail(NewNod);
			}
			NewNod.x=255;
			NewNod.y=255;
			m_PointList.AddTail(NewNod);

			m_Index[0]=0;
			for(i=1;i<255;i++)
			{
			  m_Index[i]=(int)(255*pow(i/255.0,fGamma));
			}
			m_Index[255]=255;
		}
           InvalidateRect( &rect, TRUE );
	}

//根据用户选择的通道,调用AIEDLG函数
	    if(m_sChannel=="主通道")
		{
			((CAIEDlg*)m_pParent)->AdjustPreIndex(m_Index,0);
		}
		if(m_sChannel=="红通道")
		{
			((CAIEDlg*)m_pParent)->AdjustPreIndex(m_Index,1);
		}
		if(m_sChannel=="绿通道")
		{
			((CAIEDlg*)m_pParent)->AdjustPreIndex(m_Index,2);
		}
		if(m_sChannel=="蓝通道")
		{
			((CAIEDlg*)m_pParent)->AdjustPreIndex(m_Index,3);
		}
	}

	CDialog::OnLButtonDown(nFlags, point);
}
//////////////////////////////////////////////////////////////////////////////////////////////
//当鼠标移动时调用此函数
void CCEDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	CRect		rect;	
	COORDINATE	NewNod;	
	double		fGamma;	
	int			i;		

	GetDlgItem(IDC_STATIC_FRAME)->GetClientRect(rect);
	GetDlgItem(IDC_STATIC_FRAME)->ClientToScreen(rect);
	ScreenToClient(rect);

	rect.left++;
	rect.top++;
	rect.right--;
	rect.bottom--;
	rect.right--;
	rect.bottom--;
	
	//INPUT为鼠标移动到的点,OUTPUT为索引出的值
	if(point.x>=rect.left&&point.x<=rect.right&&point.y>=rect.top&&point.y<=rect.bottom)
	{
		SetDlgItemInt(IDC_INPUT,(point.x-rect.left)*255/(rect.right-rect.left));
		SetDlgItemInt(IDC_OUTPUT,m_Index[(point.x-rect.left)*255/(rect.right-rect.left)]);
	}

	if( MouseInSlidePos(point) )
	{
	   SetCapture();
	   ::SetCursor(::LoadCursor(NULL,IDC_SIZENS) );
    }
	else
	{
	   ReleaseCapture( );
	}			  
   if(m_bDragLines)
	{
	  SetLineSlidePos(point);
	  InvalidateRect( &rect, TRUE );
	}
//为GAMMA曲线若鼠标移动位置在位置点上则调用函数
//但它不多加点,只是重新建LIST
	 if(m_bDragGamma)
	 {
	    if(point.x>rect.right)
		{
		  point.x=rect.right;
		}
	    if(point.y<rect.top)
		{
          point.y=rect.top;
		}
		NewNod.x = (point.x-rect.left)*255/(rect.right-rect.left);
		NewNod.y = (rect.bottom-point.y)*255/(rect.bottom-rect.top);
		if(NewNod.x==0||NewNod.y==0)
			return;
		fGamma=log(NewNod.y/255.0)/log(NewNod.x/255.0);
		
		m_PointList.RemoveAll();
		NewNod.x=0;
		NewNod.y=0;
		m_PointList.AddTail(NewNod);
		for(i=1;i<26;i++)
		{
		  NewNod.x=10*i;
		  NewNod.y=(int)(255*pow(NewNod.x/255.0,fGamma));
		  m_PointList.AddTail(NewNod);
		}
		NewNod.x=255;
		NewNod.y=255;
		m_PointList.AddTail(NewNod);

		Updatem_IndexfromGamma(fGamma);
		InvalidateRect( &rect, TRUE );
	}
	CDialog::OnMouseMove(nFlags, point);
}
//////////////////////////////////////////////////////////////////////////////////////////////
//当鼠标左键抬起时调用此函数
void CCEDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	double fGamma;
	COORDINATE	NewNod;	
	int i;
	CRect rect;

	GetDlgItem(IDC_STATIC_FRAME)->GetClientRect(rect);
	GetDlgItem(IDC_STATIC_FRAME)->ClientToScreen(rect);
	ScreenToClient(rect);

	if(m_bDragGamma)
	{
	  NewNod.x = (point.x-rect.left)*255/(rect.right-rect.left);
	  NewNod.y = (rect.bottom-point.y)*255/(rect.bottom-rect.top);
	  if(NewNod.x==0||NewNod.y==0)
		return;
	  fGamma=log(NewNod.y/255.0)/log(NewNod.x/255.0);
		
	  m_PointList.RemoveAll();
	  NewNod.x=0;
	  NewNod.y=0;

	  m_PointList.AddTail(NewNod);
	  for(i=1;i<26;i++)
	  {
		NewNod.x=10*i;
		NewNod.y=(int)(255*pow(NewNod.x/255.0,fGamma));
		m_PointList.AddTail(NewNod);
	  }
	  NewNod.x=255;
	  NewNod.y=255;
	  m_PointList.AddTail(NewNod);
	  Updatem_IndexfromGamma(fGamma);
	}
	if(m_bDragLines)
	{
	  Updatem_IndexfromLines( );
	}
  
	if(m_bDragGamma||m_bDragLines)
	{
	  	if(m_sChannel=="主通道")
		{
			((CAIEDlg*)m_pParent)->AdjustPreIndex(m_Index,0);
		}
		if(m_sChannel=="红通道")
		{
			((CAIEDlg*)m_pParent)->AdjustPreIndex(m_Index,1);
		}
		if(m_sChannel=="绿通道")
		{
			((CAIEDlg*)m_pParent)->AdjustPreIndex(m_Index,2);
		}
		if(m_sChannel=="蓝通道")
		{
			((CAIEDlg*)m_pParent)->AdjustPreIndex(m_Index,3);
		}
	}
	if(m_bDragGamma)
	{
	   m_bDragGamma = FALSE;
	}
	if(m_bDragLines)
	{
	   m_bDragLines = FALSE;
	}
	CDialog::OnLButtonUp(nFlags, point);
}

//////////////////////////////////////////////////////////////////////////////////////////
//判断鼠标是否滑动到LIST中的位置点									
//////////////////////////////////////////////////////////////////////////////////////////
BOOL CCEDlg::MouseInSlidePos(CPoint point)
{
	POSITION	ListPos;
	COORDINATE	ListNod;
	CRect rect;

	GetDlgItem(IDC_STATIC_FRAME)->GetClientRect(rect);
	GetDlgItem(IDC_STATIC_FRAME)->ClientToScreen(rect);
	ScreenToClient(rect);

	ListPos = m_PointList.GetHeadPosition();
	while(ListPos!=NULL)
	{
		ListNod = m_PointList.GetNext(ListPos);
		if((point.x-rect.left)*255/(rect.right-rect.left) <= ListNod.x+3 && 
			(point.x-rect.left)*255/(rect.right-rect.left) >= ListNod.x-3 &&
			(rect.bottom-point.y)*255/(rect.bottom-rect.top) <= ListNod.y+3 &&
			(rect.bottom-point.y)*255/(rect.bottom-rect.top) >= ListNod.y-3)
				return TRUE;
	}
	return FALSE;
}
//////////////////////////////////////////////////////////////////////////////////////////////
//用户在位置点上移动鼠标时直线随之变化							//
//////////////////////////////////////////////////////////////////////////////////////////////
void CCEDlg::SetLineSlidePos(CPoint point)
{
	POSITION	ListPos;
	COORDINATE	ListNod;
	COORDINATE	NewNod;
	CRect rect;

	GetDlgItem(IDC_STATIC_FRAME)->GetClientRect(rect);
	GetDlgItem(IDC_STATIC_FRAME)->ClientToScreen(rect);
	ScreenToClient(rect);

    if(point.x>rect.right)
	{
	   point.x=rect.right;
	}
	if(point.y<rect.top)
	{
       point.y=rect.top;
	}
	if(point.x<rect.left)
	{
		point.x=rect.left;
	}
	if(point.y>rect.bottom)
	{
       point.y=rect.bottom;
	}
	ListPos = m_PointList.GetHeadPosition();
	while(ListPos!=NULL)
	{
	   ListNod = m_PointList.GetNext(ListPos);
	   if((point.x-rect.left)*255/(rect.right-rect.left) <= ListNod.x+3 &&
			(point.x-rect.left)*255/(rect.right-rect.left) >= ListNod.x-3 &&
			(rect.bottom-point.y)*255/(rect.bottom-rect.top) <= ListNod.y+3 &&
			(rect.bottom-point.y)*255/(rect.bottom-rect.top) >= ListNod.y-3)
			break;
	}
    NewNod.x = (point.x-rect.left)*255/(rect.right-rect.left); 
	NewNod.y = (rect.bottom-point.y)*255/(rect.bottom-rect.top);
	if(ListPos!=NULL)
	{
	  m_PointList.GetPrev(ListPos);
      m_PointList.SetAt( ListPos, NewNod );
 	}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//例如原来的LIST中有两个位置点,通过鼠标左击确定新位置点后,LIST中增加一个
//新的位置点,同时根据LIST 中三个位置点确定点的位置索引,点间距离越大,要索引
//的点越多,即索引表越大
/////////////////////////////////////////////////////////////////////////////////////////////
//更新索引表
void CCEDlg::Updatem_IndexfromLines(void)
{
	int x0,y0,x1,y1;
	double a,b;
	POSITION	ListPos;
	COORDINATE  ListNod;
	int i;

	ListPos = m_PointList.GetHeadPosition();
	ListNod = m_PointList.GetNext(ListPos);
	x0 = ListNod.x;
	y0 = ListNod.y;
	i = 0;
	while(ListPos!=NULL)
	{
	   ListNod = m_PointList.GetNext(ListPos);
	   x1 = ListNod.x;
	   y1 = ListNod.y;
	   a = (y1-y0)*1.0/(x1-x0);
	   b = (x1*y0-x0*y1)*1.0/(x1-x0);
	   while(i<x1)
	   {
		  m_Index[i] =(int)(a*i+b);
		  i++;
	   }
       m_Index[i] = y1;
	   x0 = x1;
	   y0 = y1;
	}
}

//////////////////////////////////////////////////////////////////////////////////////////////
//更新GAMMA曲线的索引表,由于其为曲线故表大小固定但随曲线的变化,索引表的值在变化
void CCEDlg::Updatem_IndexfromGamma(double fGamma)
{
	int i;

	m_Index[0]=0;
	for(i=1;i<255;i++)
	{
	  m_Index[i]=(int)(255*pow(i/255.0,fGamma));
	}
	m_Index[255]=255;

}


void CALLBACK EXPORT MyOnTimer(struct HWND__ * hWnd,unsigned int n1,unsigned int n2,unsigned long l1)
{

}

⌨️ 快捷键说明

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