// SegmentationPage.cpp : implementation file // #include "stdafx.h" #include "SegDemo.h" #include "SegmentationPage.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CSegmentationPage property page IMPLEMENT_DYNCREATE(CSegmentationPage, CPropertyPage) CSegmentationPage::CSegmentationPage() : CPropertyPage(CSegmentationPage::IDD) { memset(&m_InputImgUserDef, 0, sizeof(m_InputImgUserDef)); memset(&m_OutputImgUserDef, 0, sizeof(m_OutputImgUserDef)); memset(&m_SegmentOptions, 0, sizeof(m_SegmentOptions)); //{{AFX_DATA_INIT(CSegmentationPage) //}}AFX_DATA_INIT } CSegmentationPage::~CSegmentationPage() { } void CSegmentationPage::DoDataExchange(CDataExchange* pDX) { CPropertyPage::DoDataExchange(pDX); //{{AFX_DATA_MAP(CSegmentationPage) DDX_Control(pDX, IDC_BKG_CHK, m_chkBackground); DDX_Control(pDX, IDC_EDIT_BGTHRSH, m_edtBackground); DDX_Control(pDX, IDC_EDIT_CLEANSIZE, m_edtCleanSize); DDX_Control(pDX, IDC_EDIT_CLRTHRESH, m_edtColor); DDX_Control(pDX, IDC_EDIT_COMBTHRSH, m_edtCombine); DDX_Control(pDX, IDC_EDIT_QUALITY, m_edtQuality); DDX_Control(pDX, IDC_SEG_IIQ_COMB, m_cmbInputImageQuality); DDX_Control(pDX, IDC_SEG_OIQ_COMB, m_cmbOutputImageQuality); DDX_Control(pDX, IDC_SEG_TYP_COMB, m_cmbSegmentType); DDX_Control(pDX, IDC_SLIDER_QUALITY, m_QualityTrack); DDX_Control(pDX, IDC_SLIDER_COMBTHRSH, m_CombineTrack); DDX_Control(pDX, IDC_SLIDER_CLRTHRESH, m_ColorTrack); DDX_Control(pDX, IDC_SLIDER_CLEANSIZE, m_CleanSizeTrack); DDX_Control(pDX, IDC_SLIDER_BGTHRSH, m_BackgroundTrack); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CSegmentationPage, CPropertyPage) //{{AFX_MSG_MAP(CSegmentationPage) ON_WM_HSCROLL() ON_CBN_SELCHANGE(IDC_SEG_IIQ_COMB, OnSelChangeInputImageQuality) ON_CBN_SELCHANGE(IDC_SEG_OIQ_COMB, OnSelChangeOutputImageQuality) ON_BN_CLICKED(IDC_BKG_CHK, OnBkgChk) ON_EN_CHANGE(IDC_EDIT_BGTHRSH, OnChangeEditBackground) ON_EN_CHANGE(IDC_EDIT_CLEANSIZE, OnChangeEditCleanSize) ON_EN_CHANGE(IDC_EDIT_COMBTHRSH, OnChangeEditCombine) ON_EN_CHANGE(IDC_EDIT_QUALITY, OnChangeEditQuality) ON_EN_CHANGE(IDC_EDIT_CLRTHRESH, OnChangeEditColor) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CSegmentationPage message handlers BOOL CSegmentationPage::OnInitDialog() { CPropertyPage::OnInitDialog(); int nPosInit [] = {10, 50, 25, 5, 75}; if(!m_pSegmentOptions) return TRUE; m_SegmentOptions = *m_pSegmentOptions; m_InputImgUserDef = *m_pSegmentOptions; m_OutputImgUserDef = *m_pSegmentOptions; m_cmbInputImageQuality.AddString(TEXT("Auto Select")); m_cmbInputImageQuality.AddString(TEXT("Noisy Image")); m_cmbInputImageQuality.AddString(TEXT("Scanned Image")); m_cmbInputImageQuality.AddString(TEXT("Printed Image")); m_cmbInputImageQuality.AddString(TEXT("Computer Generated Image")); m_cmbInputImageQuality.AddString(TEXT("Photo")); m_cmbInputImageQuality.AddString(TEXT("User Defined")); m_cmbInputImageQuality.SetCurSel(m_SegmentOptions.uInputImageType); m_cmbOutputImageQuality.AddString(TEXT("Auto Select")); m_cmbOutputImageQuality.AddString(TEXT("Poor Quality")); m_cmbOutputImageQuality.AddString(TEXT("Average Quality")); m_cmbOutputImageQuality.AddString(TEXT("Good Quality")); m_cmbOutputImageQuality.AddString(TEXT("Excellent Quality")); m_cmbOutputImageQuality.AddString(TEXT("User Defined")); m_cmbOutputImageQuality.SetCurSel(m_SegmentOptions.uOutputImageType); m_cmbSegmentType.AddString(TEXT("Favor 1 bit segments")); m_cmbSegmentType.AddString(TEXT("Favor 2 bit segments")); m_cmbSegmentType.AddString(TEXT("Force 1 bit segments")); m_cmbSegmentType.AddString(TEXT("Force 2 bit segments")); m_cmbSegmentType.SetCurSel(m_SegmentOptions.uFlags & 0x000F); m_chkBackground.SetCheck(!(m_SegmentOptions.uFlags & 0x00F0)); m_BackgroundTrack.SetRange(0,100); m_QualityTrack.SetRange(0,100); m_ColorTrack.SetRange(0,100); m_CleanSizeTrack.SetRange(0,10); m_CombineTrack.SetRange(0,300); CString strVal; strVal.Format(TEXT("%d"), m_SegmentOptions.uBackgroundThreshold); m_edtBackground.SetWindowText(strVal); strVal.Format(TEXT("%d"), m_SegmentOptions.uSegmentQuality); m_edtQuality.SetWindowText(strVal); strVal.Format(TEXT("%d"), m_SegmentOptions.uColorThreshold); m_edtColor.SetWindowText(strVal); strVal.Format(TEXT("%d"), m_SegmentOptions.uCleanSize); m_edtCleanSize.SetWindowText(strVal); strVal.Format(TEXT("%d"), m_SegmentOptions.uCombineThreshold); m_edtCombine.SetWindowText(strVal); m_BackgroundTrack.SetPos(m_SegmentOptions.uBackgroundThreshold); m_QualityTrack.SetPos(m_SegmentOptions.uSegmentQuality); m_ColorTrack.SetPos(m_SegmentOptions.uColorThreshold); m_CleanSizeTrack.SetPos(m_SegmentOptions.uCleanSize); m_CombineTrack.SetPos(m_SegmentOptions.uCombineThreshold); LockOutputOptions(m_cmbOutputImageQuality.GetCurSel() == OPIMGQ_USERDEFINED); LockInputOptions(m_cmbInputImageQuality.GetCurSel() == IMGPROF_USERDEFINED); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void CSegmentationPage::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { CString strVal; strVal.Format(TEXT("%d"), m_BackgroundTrack.GetPos()); m_edtBackground.SetWindowText(strVal); strVal.Format(TEXT("%d"), m_CleanSizeTrack.GetPos()); m_edtCleanSize.SetWindowText(strVal); strVal.Format(TEXT("%d"), m_ColorTrack.GetPos()); m_edtColor.SetWindowText(strVal); strVal.Format(TEXT("%d"), m_CombineTrack.GetPos()); m_edtCombine.SetWindowText(strVal); strVal.Format(TEXT("%d"), m_QualityTrack.GetPos()); m_edtQuality.SetWindowText(strVal); CPropertyPage::OnHScroll(nSBCode, nPos, pScrollBar); } void CSegmentationPage::LockOutputOptions(BOOL bLock) { m_edtQuality.EnableWindow(bLock); m_QualityTrack.EnableWindow(bLock); m_edtColor.EnableWindow(bLock); m_ColorTrack.EnableWindow(bLock); m_cmbSegmentType.EnableWindow(bLock); m_chkBackground.EnableWindow(bLock); } void CSegmentationPage::LockInputOptions(BOOL bLock) { m_edtBackground.EnableWindow(bLock); m_BackgroundTrack.EnableWindow(bLock); m_edtCleanSize.EnableWindow(bLock); m_CleanSizeTrack.EnableWindow(bLock); m_edtCombine.EnableWindow(bLock); m_CombineTrack.EnableWindow(bLock); } void CSegmentationPage::OnSelChangeInputImageQuality() { m_SegmentOptions.uInputImageType = m_cmbInputImageQuality.GetCurSel(); LockInputOptions(m_SegmentOptions.uInputImageType == IMGPROF_USERDEFINED); switch(m_SegmentOptions.uInputImageType) { case IMGPROF_AUTO: m_SegmentOptions.uCombineThreshold = 100; m_SegmentOptions.uBackgroundThreshold = 15; m_SegmentOptions.uCleanSize = 7; break; case IMGPROF_NOISY: m_SegmentOptions.uCombineThreshold = 125; m_SegmentOptions.uBackgroundThreshold = 25; m_SegmentOptions.uCleanSize = 10; break; case IMGPROF_SCANNED: m_SegmentOptions.uCombineThreshold = 125; m_SegmentOptions.uBackgroundThreshold = 15; m_SegmentOptions.uCleanSize = 8; break; case IMGPROF_PRINTED: m_SegmentOptions.uCombineThreshold = 100; m_SegmentOptions.uBackgroundThreshold = 10; m_SegmentOptions.uCleanSize = 7; break; case IMGPROF_COMPUTERGEN: m_SegmentOptions.uCombineThreshold = 75; m_SegmentOptions.uBackgroundThreshold = 10; m_SegmentOptions.uCleanSize = 3; break; case IMGPROF_PHOTOS: m_SegmentOptions.uCombineThreshold = 75; m_SegmentOptions.uBackgroundThreshold = 0; m_SegmentOptions.uCleanSize = 3; break; case IMGPROF_USERDEFINED: m_SegmentOptions.uCombineThreshold = m_InputImgUserDef.uCombineThreshold; m_SegmentOptions.uBackgroundThreshold = m_InputImgUserDef.uBackgroundThreshold; m_SegmentOptions.uCleanSize = m_InputImgUserDef.uCleanSize; break; } CString strVal; strVal.Format(TEXT("%d"), m_SegmentOptions.uBackgroundThreshold); m_edtBackground.SetWindowText(strVal); strVal.Format(TEXT("%d"), m_SegmentOptions.uCleanSize); m_edtCleanSize.SetWindowText(strVal); strVal.Format(TEXT("%d"), m_SegmentOptions.uCombineThreshold); m_edtCombine.SetWindowText(strVal); } void CSegmentationPage::OnSelChangeOutputImageQuality() { m_SegmentOptions.uOutputImageType = m_cmbOutputImageQuality.GetCurSel(); LockOutputOptions(m_SegmentOptions.uOutputImageType == OPIMGQ_USERDEFINED); switch(m_SegmentOptions.uOutputImageType) { case OPIMGQ_AUTO: m_SegmentOptions.uSegmentQuality = 50; m_SegmentOptions.uColorThreshold = 25; m_SegmentOptions.uFlags = SGM_FAVOR_TWOBIT | SGM_WITHOUTBKGRND; break; case OPIMGQ_POOR: m_SegmentOptions.uSegmentQuality = 0; m_SegmentOptions.uColorThreshold = 30; m_SegmentOptions.uFlags = SGM_FORCE_ONEBIT | SGM_WITHBKGRND; break; case OPIMGQ_AVG: m_SegmentOptions.uSegmentQuality = 50; m_SegmentOptions.uColorThreshold = 25; m_SegmentOptions.uFlags = SGM_FAVOR_ONEBIT | SGM_WITHBKGRND; break; case OPIMGQ_GOOD: m_SegmentOptions.uSegmentQuality = 75; m_SegmentOptions.uColorThreshold = 25; m_SegmentOptions.uFlags = SGM_FAVOR_TWOBIT | SGM_WITHOUTBKGRND; break; case OPIMGQ_EXCELLENT: m_SegmentOptions.uSegmentQuality = 100; m_SegmentOptions.uColorThreshold = 25; m_SegmentOptions.uFlags = SGM_FORCE_TWOBIT | SGM_WITHOUTBKGRND; break; case OPIMGQ_USERDEFINED: m_SegmentOptions.uSegmentQuality = m_OutputImgUserDef.uSegmentQuality; m_SegmentOptions.uColorThreshold = m_OutputImgUserDef.uColorThreshold; m_SegmentOptions.uFlags = m_OutputImgUserDef.uFlags; break; } m_cmbSegmentType.SetCurSel(m_SegmentOptions.uFlags & 0x000F); m_chkBackground.SetCheck(!(m_SegmentOptions.uFlags & 0x00F0)); CString strVal; strVal.Format(TEXT("%d"), m_SegmentOptions.uSegmentQuality); m_edtQuality.SetWindowText(strVal); strVal.Format(TEXT("%d"), m_SegmentOptions.uColorThreshold); m_edtColor.SetWindowText(strVal); } void CSegmentationPage::OnBkgChk() { m_SegmentOptions.uFlags = ((m_SegmentOptions.uFlags) & 0x000F) | (!m_chkBackground.GetCheck()<<4); if(m_cmbOutputImageQuality.GetCurSel() == OPIMGQ_USERDEFINED) { m_OutputImgUserDef.uFlags = m_SegmentOptions.uFlags; } } void CSegmentationPage::OnChangeEditBackground() { SetSliderPos(&m_edtBackground, &m_BackgroundTrack, &m_SegmentOptions.uBackgroundThreshold); } void CSegmentationPage::OnChangeEditCleanSize() { SetSliderPos(&m_edtCleanSize, &m_CleanSizeTrack, &m_SegmentOptions.uCleanSize); } void CSegmentationPage::OnChangeEditCombine() { SetSliderPos(&m_edtCombine, &m_CombineTrack, &m_SegmentOptions.uCombineThreshold); } void CSegmentationPage::OnChangeEditQuality() { SetSliderPos(&m_edtQuality, &m_QualityTrack, &m_SegmentOptions.uSegmentQuality); } void CSegmentationPage::OnChangeEditColor() { SetSliderPos(&m_edtColor, &m_ColorTrack, &m_SegmentOptions.uColorThreshold); } void CSegmentationPage::SetSliderPos(CEdit *pEdtCtrl, CSliderCtrl *pSlider, unsigned int *pVal) { CString strVal; int nMin =0 , nMax = 0; pEdtCtrl->GetWindowText(strVal); int nValue = _ttoi(strVal); pSlider->GetRange(nMin, nMax); if(nValue > nMax) { nValue = nMax; strVal.Format(TEXT("%d"), nValue); pEdtCtrl->SetWindowText(strVal); } if(nValue < nMin) { nValue = nMin; strVal.Format(TEXT("%d"), nValue); pEdtCtrl->SetWindowText(strVal); } pSlider->SetPos(nValue); *pVal = nValue; } void CSegmentationPage::OnOK() { memcpy(m_pSegmentOptions, &m_SegmentOptions, sizeof(m_SegmentOptions)); CPropertyPage::OnOK(); }