📄 dlgmeasure.cpp
字号:
// DlgMeasure.cpp : implementation file
//
#include "stdafx.h"
#include "AGV.h"
#include "DlgMeasure.h"
#include "DlgIntensity.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDlgMeasure dialog
CDlgMeasure::CDlgMeasure(CWnd* pParent /*=NULL*/)
: CDialog(CDlgMeasure::IDD, pParent)
, m_palDIB(NULL)//一定要初始化
,m_hDIB(NULL)
{
//{{AFX_DATA_INIT(CDlgMeasure)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CDlgMeasure::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgMeasure)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDlgMeasure, CDialog)
//{{AFX_MSG_MAP(CDlgMeasure)
ON_WM_PAINT()
ON_COMMAND(ID_HOLE_DETECT, OnHoleDetect)
ON_COMMAND(ID_PROCFILE_SAVE, OnProcfileSave)
ON_COMMAND(ID_PROCFILE_OPEN, OnProcfileOpen)
ON_COMMAND(ID_TO_GRAY, OnToGray)
ON_COMMAND(ID_INTENSITY, OnIntensity)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgMeasure message handlers
CScrollBar* CDlgMeasure::GetScrollBarCtrl(int nBar) const
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::GetScrollBarCtrl(nBar);
}
BOOL CDlgMeasure::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDlgMeasure::OnPaint()
{
CPaintDC dc(this); // device context for painting
CWnd *pWnd=GetDlgItem(IDC_SHOWFRAME);
CDC *pDC=pWnd->GetDC();
pWnd->Invalidate ();
pWnd->UpdateWindow ();
if(m_hDIB!=NULL)
{
LPBYTE lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL)m_hDIB);
// 获取DIB宽度
int cxDIB = (int) m_clsDIB.DIBWidth(lpDIB);
// 获取DIB高度
int cyDIB = (int) m_clsDIB.DIBHeight(lpDIB);
::GlobalUnlock((HGLOBAL)m_hDIB);
CRect rcDIB;
rcDIB.top = rcDIB.left = 0;
rcDIB.right = cxDIB;
rcDIB.bottom = cyDIB;
CRect rcDest;
rcDest=rcDIB;
m_clsDIB.PaintDIB(pDC->m_hDC,&rcDest,m_hDIB,&rcDIB,m_palDIB);
}
}
void CDlgMeasure::InitDIBData()
{
if (m_palDIB != NULL)
{
// 删除调色板对象
delete m_palDIB;
// 重置调色板为空
m_palDIB = NULL;
}
// 如果DIB对象为空,直接返回
if (m_hDIB == NULL)
{
// 返回
return;
}
LPBYTE lpDIB = (LPBYTE) ::GlobalLock((HGLOBAL) m_hDIB);
// 判断图像是否过大(INT_MAX:2,147,483,647)
if (m_clsDIB.DIBWidth(lpDIB) > INT_MAX || m_clsDIB.DIBHeight(lpDIB) > INT_MAX)
{
// 解锁DIB对象 // 释放DIB对象
::GlobalUnlock((HGLOBAL) m_hDIB);
// 释放DIB对象
::GlobalFree((HGLOBAL) m_hDIB);
// 设置DIB为空
m_hDIB = NULL;
CString strMsg;
strMsg = "BMP图像太大!";
// 提示用户
MessageBox(strMsg,"系统提示",MB_ICONINFORMATION|MB_OK);
// 返回
return;
}
}
BOOL CDlgMeasure::Create()
{
return CDialog::Create(CDlgMeasure::IDD);
}
void CDlgMeasure::OnHoleDetect()
{
/*
HDIB htemp=m_clsDIB.XTo256(m_hDIB);
// 解锁DIB对象
::GlobalUnlock((HGLOBAL)m_hDIB);
// 释放DIB对象
::GlobalFree ((HGLOBAL)m_hDIB);
m_hDIB=(HDIB)m_clsDIB.CopyHandle((HGLOBAL)htemp);
if(m_hDIB==NULL)
{
AfxMessageBox("转换失败!");
return;
}
::GlobalUnlock(htemp);
::GlobalFree ((HGLOBAL)htemp);
//创建点处理CPointPro类对象m_hDIB
CGrayProc PointOperation;
BeginWaitCursor();
if( PointOperation.HoleDetect(m_hDIB)==FALSE)
AfxMessageBox("holedetect is false!");
EndWaitCursor();
Invalidate();
UpdateWindow();
*/
}
void CDlgMeasure::OnProcfileSave()
{
CString strPathName;
CFile file;
CString strSaveFileType = "位图文件 (*.bmp;*.dib)|*.bmp; *.dib|All Files (*.*)|*.*||";
CFileDialog FileDlg(FALSE, "*.bmp", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strSaveFileType);
if( FileDlg.DoModal() == IDOK )
{
strPathName = FileDlg.GetPathName();
// 打开文件
file.Open(strPathName, CFile::modeCreate|CFile::modeWrite);
// 尝试调用ReadDIBFile()读取图像
BOOL bSuccess=m_clsDIB.SaveDIB(m_hDIB, file);
if (!bSuccess)
{
// 保存失败,可能是其它格式的DIB,可以读取但是不能保存
// 或者是SaveDIB函数有误
// 提示出错
AfxMessageBox("cannot create the file to save");
return;
}
file.Close();
}
}
void CDlgMeasure::OnProcfileOpen()
{
CString strPathName;
CFile file;
char szFilter[] = "位图文件(*.BMP)|*.BMP|";
CFileDialog FileDlg( TRUE, NULL, NULL, OFN_HIDEREADONLY, szFilter );
if( FileDlg.DoModal() == IDOK )
{
strPathName = FileDlg.GetPathName();
// 打开文件
file.Open(strPathName, CFile::modeRead | CFile::shareDenyWrite, NULL);
// 尝试调用ReadDIBFile()读取图像
m_hDIB = m_clsDIB.ReadDIBFile(file);
// 初始化DIB
InitDIBData();
}
//刷新
Invalidate();
UpdateWindow();
}
void CDlgMeasure::OnToGray()
{
CGrayProc PointOperation;
BeginWaitCursor();
PointOperation.ToGray(m_hDIB);
EndWaitCursor();
Invalidate();
UpdateWindow();
}
void CDlgMeasure::OnIntensity()
{
// 循环变量
int i;
// 各颜色分量的灰度分布密度[256]
int* fPs_Y;
// 计算灰度分布密度
CGrayProc clsGrayProc;
fPs_Y=clsGrayProc.GetIntensity(m_hDIB) ;
CDlgIntensity dlg;
// 传递灰度分布密度数据给面板类
for (i = 0; i <256; i++)
dlg.m_fIntensity[i] = fPs_Y[i];
// 显示面板
//显示对话框
if ( dlg.DoModal() != IDOK)
return;
delete [] fPs_Y;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -