📄 thresholddlg.cpp
字号:
// ThresholdDlg.cpp : implementation file
//
#include "stdafx.h"
#include "RSIP.h"
#include "ThresholdDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define FLAGSIZE 8
/////////////////////////////////////////////////////////////////////////////
// CThresholdDlg dialog
CThresholdDlg::CThresholdDlg(CWnd* pParent /*=NULL*/)
: CDialog(CThresholdDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CThresholdDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_nThresholdLevel = 128;
m_bSelect = FALSE;
}
void CThresholdDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CThresholdDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CThresholdDlg, CDialog)
//{{AFX_MSG_MAP(CThresholdDlg)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CThresholdDlg message handlers
void CThresholdDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
RECT Rect;
SetRect(&Rect,7,22,112,63);
MapDialogRect(&Rect);
double dXRatio = (double)(Rect.right - Rect.left)/256;
float dMaxYRatio = 0.0;
for(int i=0;i<256;i++)
if(m_pdwHistogram[i]>dMaxYRatio)
dMaxYRatio = (float)m_pdwHistogram[i];
dMaxYRatio = (Rect.bottom-Rect.top)/dMaxYRatio;
for(i=0;i<256;i++)
{
dc.MoveTo(int(Rect.left+dXRatio*i),Rect.bottom);
dc.LineTo(int(Rect.left+dXRatio*i),
int(Rect.bottom-m_pdwHistogram[i]*dMaxYRatio));
}
dc.SetROP2(R2_NOT);
m_nPosition = int((float)m_nThresholdLevel/256*(Rect.right-Rect.left));
dc.MoveTo(Rect.left+m_nPosition,Rect.bottom);
dc.LineTo(Rect.left+m_nPosition,Rect.top);
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(&Bitmap);
dc.BitBlt(Rect.left+m_nPosition-FLAGSIZE/2,
Rect.bottom+4,
Rect.left+m_nPosition-FLAGSIZE/2+FLAGSIZE,
Rect.bottom+4+FLAGSIZE,
&MemDC,0,0,SRCINVERT);
MemDC.DeleteDC();
Bitmap.DeleteObject();
}
void CThresholdDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
RECT Rect;
SetRect(&Rect,7,22,112,63);
MapDialogRect(&Rect);
if(point.x>Rect.left+m_nPosition-FLAGSIZE/2&&
point.x<Rect.left+m_nPosition+FLAGSIZE/2&&
point.y>Rect.bottom+4&&
point.y<Rect.bottom+4+FLAGSIZE)
{
m_bSelect = TRUE;
m_nDelta = point.x-(Rect.left+m_nPosition-FLAGSIZE/2);
SetCapture();
}
CDialog::OnLButtonDown(nFlags, point);
}
void CThresholdDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if(!m_bSelect)
return;
ReleaseCapture();
m_bSelect = FALSE;
CDialog::OnLButtonUp(nFlags, point);
}
void CThresholdDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if(!m_bSelect)
return;
RECT Rect;
SetRect(&Rect,7,22,112,63);
MapDialogRect(&Rect);
int OldPosition = m_nPosition;
m_nPosition = point.x-m_nDelta+FLAGSIZE/2-Rect.left;
if(m_nPosition<0)
m_nPosition = 0;
else if(m_nPosition>(Rect.right-Rect.left))
m_nPosition = Rect.right-Rect.left;
m_nThresholdLevel = int((float)m_nPosition/(Rect.right-Rect.left)*255);
SetDlgItemInt(IDC_THRESHOLD,m_nThresholdLevel);
CClientDC dc(this);
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(&Bitmap);
dc.SetROP2(R2_NOT);
dc.MoveTo(Rect.left+OldPosition,Rect.bottom);
dc.LineTo(Rect.left+OldPosition,Rect.top);
dc.BitBlt(Rect.left+OldPosition-FLAGSIZE/2,
Rect.bottom+4,
Rect.left+OldPosition-FLAGSIZE/2+FLAGSIZE,
Rect.bottom+4+FLAGSIZE,
&MemDC,0,0,SRCINVERT);
dc.MoveTo(Rect.left+m_nPosition,Rect.bottom);
dc.LineTo(Rect.left+m_nPosition,Rect.top);
dc.BitBlt(Rect.left+m_nPosition-FLAGSIZE/2,
Rect.bottom+4,
Rect.left+m_nPosition-FLAGSIZE/2+FLAGSIZE,
Rect.bottom+4+FLAGSIZE,
&MemDC,0,0,SRCINVERT);
MemDC.DeleteDC();
Bitmap.DeleteObject();
CDialog::OnMouseMove(nFlags, point);
}
BOOL CThresholdDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetDlgItemInt(IDC_THRESHOLD,m_nThresholdLevel);
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CPosterizeDlg dialog
CPosterizeDlg::CPosterizeDlg(CWnd* pParent /*=NULL*/)
: CDialog(CPosterizeDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CPosterizeDlg)
m_bEqualDistance = TRUE;
m_nPoint = 0;
//}}AFX_DATA_INIT
for(int i=0; i<256; i++)
m_lpPoint[i] = i;
m_nPointNum = 256;
m_nNum = 255;
m_bSelect = FALSE;
}
void CPosterizeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPosterizeDlg)
DDX_Control(pDX, IDC_POINTLIST, m_PointList);
DDX_Check(pDX, IDC_EQUAL_DISTANCE, m_bEqualDistance);
DDX_Text(pDX, IDC_POINT, m_nPoint);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CPosterizeDlg, CDialog)
//{{AFX_MSG_MAP(CPosterizeDlg)
ON_LBN_SELCHANGE(IDC_POINTLIST, OnSelchangePointlist)
ON_BN_CLICKED(IDC_ADDPOINT, OnAddpoint)
ON_BN_CLICKED(IDC_DELETEPOINT, OnDeletepoint)
ON_BN_CLICKED(IDC_EQUAL_DISTANCE, OnEqualDistance)
ON_EN_CHANGE(IDC_NUM, OnChangeNum)
ON_WM_PAINT()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_BN_CLICKED(IDC_MODIFYPOINT, OnModifypoint)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CPosterizeDlg message handlers
void CPosterizeDlg::OnSelchangePointlist()
{
int index = m_PointList.GetCurSel();
int OldPosition = m_nPoint;
m_nPoint = m_lpPoint[index];
SetDlgItemInt(IDC_POINT,m_nPoint);
m_bSelect = FALSE;
//OnPaint();
RECT Rect;
SetRect(&Rect,50,62,136,120);
MapDialogRect(&Rect);
InvalidateRect(&Rect,TRUE);
}
void CPosterizeDlg::OnAddpoint()
{
m_nPointNum = m_PointList.GetCount();
m_lpPoint[m_nPointNum] = m_nPoint;
m_nNum = m_nPointNum;
m_nPointNum = m_nPointNum+1;
//排序
BYTE tmp;
int nTmp = m_nPointNum-1;
for(int i=m_nPointNum-2; i>=0; i--)
if(m_lpPoint[i]>m_lpPoint[nTmp])
{
tmp = m_lpPoint[i];
m_lpPoint[i] = m_lpPoint[nTmp];
m_lpPoint[nTmp] = tmp;
nTmp = i;
}
//重显
m_PointList.ResetContent();
for(int j=0; j<m_nPointNum; j++)
{
char temp[5];
itoa(m_lpPoint[j],temp,10);
m_PointList.AddString(temp);
}
SetDlgItemInt(IDC_NUM,m_nNum);
m_PointList.SetCurSel(nTmp);
}
void CPosterizeDlg::OnDeletepoint()
{
// 修改内存数据
int index = m_PointList.GetCurSel();
for(int i=index; i<m_nPointNum-1; i++)
{
m_lpPoint[i] = m_lpPoint[i+1];
}
// 修改显示数据
m_nPointNum = m_PointList.GetCount()-1;
m_nNum = m_nPointNum-1;
m_PointList.DeleteString(index);
SetDlgItemInt(IDC_NUM,m_nNum);
}
void CPosterizeDlg::OnModifypoint()
{
int index = m_PointList.GetCurSel();
m_lpPoint[index] = m_nPoint;
m_PointList.ResetContent();
for(int j=0; j<m_nPointNum; j++)
{
char temp[5];
itoa(m_lpPoint[j],temp,10);
m_PointList.AddString(temp);
}
m_PointList.SetCurSel(index);
}
void CPosterizeDlg::OnEqualDistance()
{
m_bEqualDistance = !m_bEqualDistance;
if(m_bEqualDistance == TRUE)
{
GetDlgItem(IDC_ADDPOINT)->EnableWindow(FALSE);
GetDlgItem(IDC_DELETEPOINT)->EnableWindow(FALSE);
GetDlgItem(IDC_MODIFYPOINT)->EnableWindow(FALSE);
GetDlgItem(IDC_NUM)->EnableWindow(TRUE);
}
else
{
GetDlgItem(IDC_ADDPOINT)->EnableWindow(TRUE);
GetDlgItem(IDC_DELETEPOINT)->EnableWindow(TRUE);
GetDlgItem(IDC_MODIFYPOINT)->EnableWindow(TRUE);
GetDlgItem(IDC_NUM)->EnableWindow(FALSE);
m_nNum = 1;
}
SetDlgItemInt(IDC_POINT,m_nPoint);
SetDlgItemInt(IDC_NUM,m_nNum);
m_nPointNum = m_nNum+1;
for(int i=0; i<m_nPointNum; i++)
{
m_lpPoint[i] = BYTE(i*255.0/m_nNum);
}
m_PointList.ResetContent();
for(int j=0; j<m_nPointNum; j++)
{
char temp[5];
itoa(m_lpPoint[j],temp,10);
m_PointList.AddString(temp);
}
}
void CPosterizeDlg::OnChangeNum()
{
m_nNum = GetDlgItemInt(IDC_NUM);
m_nPointNum = m_nNum+1;
if(m_bEqualDistance == TRUE)
for(int i=0; i<m_nPointNum; i++)
{
m_lpPoint[i] = BYTE(i*255.0/m_nNum);
}
m_PointList.ResetContent();
for(int j=0; j<m_nPointNum; j++)
{
char temp[5];
itoa(m_lpPoint[j],temp,10);
m_PointList.AddString(temp);
}
}
BOOL CPosterizeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
if(m_bEqualDistance == TRUE)
{
GetDlgItem(IDC_ADDPOINT)->EnableWindow(FALSE);
GetDlgItem(IDC_DELETEPOINT)->EnableWindow(FALSE);
GetDlgItem(IDC_MODIFYPOINT)->EnableWindow(FALSE);
GetDlgItem(IDC_NUM)->EnableWindow(TRUE);
}
else
{
GetDlgItem(IDC_ADDPOINT)->EnableWindow(TRUE);
GetDlgItem(IDC_DELETEPOINT)->EnableWindow(TRUE);
GetDlgItem(IDC_MODIFYPOINT)->EnableWindow(TRUE);
GetDlgItem(IDC_NUM)->EnableWindow(FALSE);
}
SetDlgItemInt(IDC_POINT,m_nPoint);
SetDlgItemInt(IDC_NUM,m_nNum);
m_PointList.ResetContent();
for(int i=0; i<m_nPointNum; i++)
{
char temp[5];
itoa(m_lpPoint[i],temp,10);
m_PointList.AddString(temp);
}
return TRUE;
}
void CPosterizeDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
RECT Rect;
SetRect(&Rect,52,62,133,112);
MapDialogRect(&Rect);
double dXRatio = (double)(Rect.right - Rect.left)/256;
float dMaxYRatio = 0.0;
for(int i=0; i<256; i++)
if(m_pdwHistogram[i]>dMaxYRatio)
dMaxYRatio = (float)m_pdwHistogram[i];
dMaxYRatio = (Rect.bottom-Rect.top)/dMaxYRatio;
for(i=0; i<256; i++)
{
dc.MoveTo(int(Rect.left+dXRatio*i),Rect.bottom);
dc.LineTo(int(Rect.left+dXRatio*i),
int(Rect.bottom-m_pdwHistogram[i]*dMaxYRatio));
}
dc.SetROP2(R2_NOT);
m_nPosition = int((float)m_nPoint/256*(Rect.right-Rect.left));
dc.MoveTo(Rect.left+m_nPosition,Rect.bottom);
dc.LineTo(Rect.left+m_nPosition,Rect.top);
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(&Bitmap);
dc.BitBlt(Rect.left+m_nPosition-FLAGSIZE/2,
Rect.bottom+4,
Rect.left+m_nPosition-FLAGSIZE/2+FLAGSIZE,
Rect.bottom+4+FLAGSIZE,
&MemDC,0,0,SRCINVERT);
MemDC.DeleteDC();
Bitmap.DeleteObject();
}
void CPosterizeDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
RECT Rect;
SetRect(&Rect,52,62,133,112);
MapDialogRect(&Rect);
if(point.x>Rect.left+m_nPosition-FLAGSIZE/2 &&
point.x<Rect.left+m_nPosition+FLAGSIZE/2 &&
point.y>Rect.bottom+4 &&
point.y<Rect.bottom+4+FLAGSIZE)
{
m_bSelect = TRUE;
m_nDelta = point.x-(Rect.left+m_nPosition-FLAGSIZE/2);
SetCapture();
}
CDialog::OnLButtonDown(nFlags, point);
}
void CPosterizeDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
if(!m_bSelect)
return;
ReleaseCapture();
m_bSelect = FALSE;
CDialog::OnLButtonUp(nFlags, point);
}
void CPosterizeDlg::OnMouseMove(UINT nFlags, CPoint point)
{
if(!m_bSelect)
return;
RECT Rect;
SetRect(&Rect,52,62,133,112);
MapDialogRect(&Rect);
int OldPosition = m_nPosition;
m_nPosition = point.x-m_nDelta+FLAGSIZE/2-Rect.left;
if(m_nPosition<0)
m_nPosition = 0;
else if(m_nPosition>(Rect.right-Rect.left))
m_nPosition = Rect.right-Rect.left;
m_nPoint = int((float)m_nPosition/(Rect.right-Rect.left)*255);
SetDlgItemInt(IDC_POINT,m_nPoint);
CClientDC dc(this);
CBitmap Bitmap;
Bitmap.LoadBitmap(IDB_BITMAP1);
CDC MemDC;
MemDC.CreateCompatibleDC(&dc);
MemDC.SelectObject(&Bitmap);
dc.SetROP2(R2_NOT);
dc.MoveTo(Rect.left+OldPosition,Rect.bottom);
dc.LineTo(Rect.left+OldPosition,Rect.top);
dc.BitBlt(Rect.left+OldPosition-FLAGSIZE/2,
Rect.bottom+4,
Rect.left+OldPosition-FLAGSIZE/2+FLAGSIZE,
Rect.bottom+4+FLAGSIZE,
&MemDC,0,0,SRCINVERT);
dc.MoveTo(Rect.left+m_nPosition,Rect.bottom);
dc.LineTo(Rect.left+m_nPosition,Rect.top);
dc.BitBlt(Rect.left+m_nPosition-FLAGSIZE/2,
Rect.bottom+4,
Rect.left+m_nPosition-FLAGSIZE/2+FLAGSIZE,
Rect.bottom+4+FLAGSIZE,
&MemDC,0,0,SRCINVERT);
MemDC.DeleteDC();
Bitmap.DeleteObject();
CDialog::OnMouseMove(nFlags, point);
}
void CPosterizeDlg::OnOK()
{
if(m_nNum != m_nPointNum-1)
{
AfxMessageBox("分割点数目和分割等级不符!\n\n请重新设置分割点!");
return;
}
CDialog::OnOK();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -