📄 usedlgs.cpp
字号:
if(abs(p2.x-p1.x)==0)
{
IsHorizontal = FALSE;
dx = 0;
dy = (p2.y-p1.y)>0 ? 1 : -1;
}
else if(abs(p1.y-p2.y)==0)
{
IsHorizontal = TRUE;
dx = (p2.x-p1.x)>0 ? 1 : -1;
dy = 0;
}
else
{
if(abs(p1.x-p2.x)>abs(p1.y-p2.y))
{
IsHorizontal = TRUE;
dx = (p2.x-p1.x)>0 ? 1 : -1;
dy = (double)(p2.y-p1.y)/(double)(abs(p2.x-p1.x));
}
else
{
IsHorizontal = FALSE;
dy = (p2.y-p1.y)>0 ? 1 : -1;
dx = (double)(p2.x-p1.x)/(double)(abs(p2.y-p1.y));
}
}
double x=p1.x, y=p1.y;
if(m_pDoc->Image.m_wImageDepth==8)
{
LineGray = new int[PtNum];
for(int i=0; i<PtNum ;i++)
{
if(IsHorizontal)
{
LineGray[i] = m_pDoc->Image.RowAddress[int(y+0.5)][int(x)];
}
else
{
LineGray[i] = m_pDoc->Image.RowAddress[int(y)][int(x+0.5)];
}
x += dx;
y += dy;
}
}
else
{
LineRed = new int[PtNum];
LineGreen = new int[PtNum];
LineBlue = new int[PtNum];
RGBTRIPLE temp;
for(int i=0; i<PtNum ;i++)
{
if(IsHorizontal)
{
temp = m_pDoc->Image.GetRGBPixel(int(x), int(y+0.5));
LineRed[i] = temp.rgbtRed;
LineGreen[i] = temp.rgbtGreen;
LineBlue[i] = temp.rgbtBlue;
}
else
{
temp = m_pDoc->Image.GetRGBPixel(int(x+0.5), int(y));
LineRed[i] = temp.rgbtRed;
LineGreen[i] = temp.rgbtGreen;
LineBlue[i] = temp.rgbtBlue;
}
x += dx;
y += dy;
}
}
}
CRect rect;
GetWindowRect(&rect);
SetWindowPos(NULL,rect.left,rect.top,PtNum+50,Height+40,SWP_NOACTIVATE);
CButton *PButton = (CButton*) GetDlgItem(IDOK);
PButton->GetWindowRect(&rect);
GetParent()->ScreenToClient(&rect);
PButton->SetWindowPos(NULL,PtNum+10,Height-50,rect.Width(),rect.Height(),SWP_NOACTIVATE);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CLineGrayInfoDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
int i,orgPtx = 5, orgy = Height+10;
if(LineGray!=NULL||(LineRed!=NULL && LineGreen!=NULL && LineBlue!=NULL))
{
dc.MoveTo(orgPtx, orgy);
dc.LineTo(orgPtx, orgy - Height -1);
dc.LineTo(orgPtx + PtNum + 6, orgy - Height -1);
dc.MoveTo(orgPtx,orgy);
dc.LineTo(orgPtx + PtNum + 6, orgy);
dc.MoveTo(orgPtx + PtNum +1, orgy);
dc.LineTo(orgPtx + PtNum +1, orgy - Height -1);
dc.SetTextAlign(TA_CENTER);
dc.SetBkMode(TRANSPARENT);
dc.TextOut(orgPtx + PtNum + 20, orgy - 10, "0");
dc.TextOut(orgPtx + PtNum + 20, orgy - Height-8, "255");
if(m_pDoc->Image.m_wImageDepth==8&&LineGray!=NULL)
{
dc.MoveTo(orgPtx,orgy - LineGray[0]/2);
for(i=1; i<PtNum ;i++)
{
dc.LineTo(orgPtx+i,orgy - LineGray[i]/2);
}
}
else
{
//画红色分量的直方图
CPen RedPen(PS_SOLID,1,RGB(255,0,0));
CPen *pOldPen = dc.SelectObject(&RedPen);
dc.MoveTo(orgPtx,orgy - LineRed[0]/2);
for(i=1; i<PtNum ;i++)
{
dc.LineTo(orgPtx+i,orgy - LineRed[i]/2);
}
dc.SelectObject(pOldPen);
//画绿色分量的直方图
CPen GreenPen(PS_SOLID,1,RGB(0,255,0));
pOldPen = dc.SelectObject(&GreenPen);
dc.MoveTo(orgPtx,orgy - LineGreen[0]/2);
for(i=1; i<PtNum ;i++)
{
dc.LineTo(orgPtx+i,orgy - LineGreen[i]/2);
}
dc.SelectObject(pOldPen);
//画蓝色分量的直方图
CPen BluePen(PS_SOLID,1,RGB(0,0,255));
pOldPen = dc.SelectObject(&BluePen);
dc.MoveTo(orgPtx,orgy - LineBlue[0]/2);
for(i=1; i<PtNum ;i++)
{
dc.LineTo(orgPtx+i,orgy - LineBlue[i]/2);
}
dc.SelectObject(pOldPen);
}
}
}
void CLineGrayInfoDlg::OnOK()
{
int Answer = AfxMessageBox("你是否愿意将线信息存盘吗", MB_OKCANCEL|MB_ICONQUESTION );
if(Answer==IDOK)
{
CString filt = " Line Image(TXT)|*.txt|(*.txt)||";
CFileDialog dlgFile(false,"*.BMP","", OFN_HIDEREADONLY,filt,NULL);
dlgFile.m_ofn.Flags|=OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT;
if(dlgFile.DoModal()==IDOK)
{
FILE *wf;
wf = fopen(dlgFile.GetPathName(), "w");
fprintf(wf, "%d\n", PtNum);
for(int i=0; i<PtNum; i++)
fprintf(wf, "%4d %4d\n", i, LineGray[i]);
fclose(wf);
}
}
CDialog::OnOK();
}
void CLineGrayInfoDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: Add your message handler code here
if(LineGray != NULL) delete []LineGray;
if(LineGreen!= NULL) delete []LineGreen;
if(LineRed != NULL) delete []LineRed;
if(LineBlue != NULL) delete []LineBlue;
}
/////////////////////////////////////////////////////////////////////////////
// CSusanPramDlg dialog
CSusanPramDlg::CSusanPramDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSusanPramDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSusanPramDlg)
m_bt = 20;
m_dt = 4.0;
//}}AFX_DATA_INIT
}
void CSusanPramDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSusanPramDlg)
DDX_Text(pDX, IDC_BT, m_bt);
DDV_MinMaxInt(pDX, m_bt, 1, 50);
DDX_Text(pDX, IDC_DT, m_dt);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSusanPramDlg, CDialog)
//{{AFX_MSG_MAP(CSusanPramDlg)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSusanPramDlg message handlers
/////////////////////////////////////////////////////////////////////////////
// CMaskSizeDlg dialog
CMaskSizeDlg::CMaskSizeDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMaskSizeDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMaskSizeDlg)
m_MaskSize = 5;
//}}AFX_DATA_INIT
}
void CMaskSizeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMaskSizeDlg)
DDX_Control(pDX, IDC_SPIN1, m_Spin1);
DDX_Text(pDX, IDC_MaskSize, m_MaskSize);
DDV_MinMaxInt(pDX, m_MaskSize, 3, 151);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMaskSizeDlg, CDialog)
//{{AFX_MSG_MAP(CMaskSizeDlg)
ON_NOTIFY(UDN_DELTAPOS, IDC_SPIN1, OnDeltaposSpin1)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMaskSizeDlg message handlers
BOOL CMaskSizeDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_Spin1.SetRange( 3, 151 );
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CMaskSizeDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
m_MaskSize += 2*pNMUpDown->iDelta;
if(m_MaskSize>151)
{
m_MaskSize = 151;
}
else if(m_MaskSize<3)
{
m_MaskSize = 3;
}
UpdateData(FALSE);
*pResult = 0;
}
/////////////////////////////////////////////////////////////////////////////
// CManualBinaryDlg dialog
CManualBinaryDlg::CManualBinaryDlg(CImageLABDoc *_pDoc,CWnd* pParent /*=NULL*/)
: CDialog(CManualBinaryDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CManualBinaryDlg)
m_BinaryType = 0;
m_Threshold = 125;
//}}AFX_DATA_INIT
InitOk = FALSE;
m_pDoc = _pDoc;
dashPen.CreatePen(PS_DOT,1,RGB(0,255,255));
BlackPen.CreatePen(PS_SOLID,1,RGB(0,0,0));
StartPt.x = 10; // the ORIGINAL point.
StartPt.y = 110;
triangleTopPoint.x = StartPt.x+m_Threshold;
triangleTopPoint.y = StartPt.y+1;
memset(HistogramR,0,256*sizeof(int));
pView = m_pDoc->m_pView;
if(pView!=NULL)
{
m_pDoc = pView->GetDocument();
if(m_pDoc->Image.m_lpDibArray!=NULL)
{
pView->GetSelectArea(p1, p2);
if(pView->DashRectDrawed)
{
if(m_pDoc->Image.m_wImageDepth==8)
{
for(long j=p1.y;j<p2.y;j++)
{
for(long i=p1.x;i<p2.x;i++)
{
HistogramR[m_pDoc->Image.GetGrayV(i, j)]++;
}
}
}
}
else
{
if(m_pDoc->Image.m_wImageDepth==8)
{
BYTE *temp = m_pDoc->Image.m_lpDibArray;
for(int i=0;i<m_pDoc->Image.m_ImageSize;i++)
{
HistogramR[*temp++]++;
}
}
}
}
}
MaxFrequencyR = 0;
for(int i=0;i<256;i++)
{
if(MaxFrequencyR<HistogramR[i]) MaxFrequencyR = HistogramR[i];
}
}
void CManualBinaryDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CManualBinaryDlg)
DDX_Control(pDX, IDC_SLIDER1, m_Slide1);
DDX_Control(pDX, IDC_SPIN1, m_Spin1);
DDX_Radio(pDX, IDC_RADIO1, m_BinaryType);
DDX_Text(pDX, IDC_EDIT1, m_Threshold);
DDV_MinMaxByte(pDX, m_Threshold, 0, 255);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CManualBinaryDlg, CDialog)
//{{AFX_MSG_MAP(CManualBinaryDlg)
ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1)
ON_WM_HSCROLL()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
ON_WM_SETCURSOR()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CManualBinaryDlg message handlers
void CManualBinaryDlg::OnChangeEdit1()
{
if(!InitOk) return;
CClientDC dc(this);
CPoint tmpP;
m_Threshold = (BYTE) GetDlgItemInt(IDC_EDIT1,NULL,FALSE);
CSliderCtrl* pSlider = (CSliderCtrl*)GetDlgItem(IDC_SLIDER1);
pSlider->SetPos(m_Threshold);
pOldPen = dc.SelectObject(&dashPen);
dc.SetROP2(R2_XORPEN);
dc.MoveTo(triangleTopPoint);
tmpP.x = triangleTopPoint.x - 3;
tmpP.y = triangleTopPoint.y + 5;
dc.LineTo(tmpP);
tmpP.x += 6;
dc.LineTo(tmpP);
dc.LineTo(triangleTopPoint);
triangleTopPoint.x = m_Threshold + StartPt.x;
// draw triangle (4*3)
dc.MoveTo(triangleTopPoint);
tmpP.x = triangleTopPoint.x - 3;
tmpP.y = triangleTopPoint.y + 5;
dc.LineTo(tmpP);
tmpP.x += 6;
dc.LineTo(tmpP);
dc.LineTo(triangleTopPoint);
int total=0;
int NowTotal=0;
for(int i=0;i<255;i++)
{
total += HistogramR[i];
if(i<=m_Threshold) NowTotal+= HistogramR[i];
}
CString msg;
msg.Format(" %8.3f ",(double)NowTotal/(double)total);
SetDlgItemText(IDC_PROP,msg);
dc.SelectObject(pOldPen);
if(pView!=NULL)
{
if(m_pDoc->Image.m_lpDibArray!=NULL&&m_pDoc->Image.m_wImageDepth==8)
{
m_pDoc->Image.ImgSwap();
m_pDoc->Image.BackUp();
if(pView->DashRectDrawed)
{
m_pDoc->Image.Binary2(m_Threshold,m_BinaryType,p1, p2);
CRect InvalRect;
InvalRect.left = p1.x - pView->ScrollOrgPt.x;
InvalRect.top = p1.y - pView->ScrollOrgPt.y;
InvalRect.right = p2.x+1 - pView->ScrollOrgPt.x;
InvalRect.bottom = p2.y+1 - pView->ScrollOrgPt.y;
pView->InvalidateRect(InvalRect, FALSE);
}
else
{
m_pDoc->Image.Binary2(m_Threshold,m_BinaryType);
pView->Invalidate(FALSE);
}
}
}
}
BOOL CManualBinaryDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
m_Spin1.SetRange( 0, 255 );
m_Threshold = 125;
m_Slide1.SetRange(0, 255);
m_Slide1.SetPos(m_Threshold);
InitOk = TRUE;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CManualBinaryDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
CSliderCtrl* pSlider = (CSliderCtrl*)pScrollBar;
if(pSlider!= NULL)
{
m_Threshold = pSlider->GetPos();
SetDlgItemInt(IDC_EDIT1,m_Threshold,FALSE);
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CManualBinaryDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
pOldPen = dc.SelectObject(&BlackPen);
dc.SetROP2(R2_BLACK);
CPoint tmpP(StartPt.x+255,StartPt.y+1);
dc.MoveTo(StartPt.x,StartPt.y+1);
dc.LineTo(tmpP);
dc.MoveTo(StartPt.x,StartPt.y+2);
dc.LineTo(tmpP.x, tmpP.y+1);
// draw triangle (4*3)
dc.SelectObject(&dashPen);
dc.SetROP2(R2_XORPEN);
dc.MoveTo(triangleTopPoint);
tmpP.x = triangleTopPoint.x-3;
tmpP.y = triangleTopPoint.y+5;
dc.LineTo(tmpP);
tmpP.x += 6;
dc.LineTo(tmpP);
dc.LineTo(triangleTopPoint);
dc.SetBkMode(TRANSPARENT);
dc.TextOut(StartPt.x,StartPt.y+2,"0");
dc.TextOut(StartPt.x+240,StartPt.y+2,"255");
//draw histogram picture
dc.SetROP2(R2_COPYPEN);
CPoint BottomP = StartPt;
double scale = 100/(double)MaxFrequencyR;
dc.SelectObject(&BlackPen);
for(WORD i = 0; i < 256; i++)
{
tmpP.x = BottomP.x;
tmpP.y = BottomP.y - int(HistogramR[i]*scale);
dc.MoveTo(BottomP);
dc.LineTo(tmpP);
BottomP.x++;
}
dc.SelectObject(pOldPen);
}
void CManualBinaryDlg::OnOK()
{
OnChangeEdit1();
CDialog::OnOK();
}
void CManualBinaryDlg::OnRadio1()
{
m_BinaryType = 0;
}
void CManualBinaryDlg::OnRadio2()
{
m_BinaryType = 1;
}
void CManualBinaryDlg::OnRadio3()
{
m_BinaryType = 2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -