📄 cedlg.cpp
字号:
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 + -