www.pudn.com > isee_code01231.zip > FilterDlg.cpp


// FilterDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "flt_mass.h" 
#include "FilterDlg.h" 
#include "DrawPreView.h" 
#include "System.h" 
#include "ConvoluteKernel.h" 
#include "EdgeEnhance.h" 
#include "Filter.h" 
#include "draw.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define	HIGH_FILTER			0 
#define	MEDIAN_FILTER		1 
#define	LOW_FILTER			2 
#define	DELAYTIME			500 
#define	LEFT				8 
#define TOP					8 
 
///////////////////////////////////////////////////////////////////////////// 
// CFilterDlg dialog 
 
 
CFilterDlg::CFilterDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CFilterDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CFilterDlg) 
	m_Check_PreView = TRUE; 
	m_strFilter = _T(""); 
	//}}AFX_DATA_INIT 
	m_bMouseDown=FALSE; 
	m_bMouseShow=TRUE; 
	m_nFilter=0; 
	m_nStrength=100; 
 
} 
 
 
void CFilterDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CFilterDlg) 
	DDX_Control(pDX, IDC_BUTTON_EDIT, m_ButEdit); 
	DDX_Control(pDX, IDC_EDIT_FILTER, m_EditFilter); 
	DDX_Control(pDX, IDC_TAB_FILTER, m_TabInfo); 
	DDX_Control(pDX, IDC_COMBO_FILTER, m_Combo_Stype); 
	DDX_Check(pDX, IDC_CHECK_PREVFILTER, m_Check_PreView); 
	DDX_Text(pDX, IDC_EDIT_FILTER, m_strFilter); 
	DDV_MaxChars(pDX, m_strFilter, 3); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CFilterDlg, CDialog) 
	//{{AFX_MSG_MAP(CFilterDlg) 
	ON_WM_DRAWITEM() 
	ON_CBN_SELCHANGE(IDC_COMBO_FILTER, OnSelchangeComboFilter) 
	ON_WM_TIMER() 
	ON_WM_PAINT() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_LBUTTONUP() 
	ON_WM_MOUSEMOVE() 
	ON_BN_CLICKED(IDC_CHECK_PREVFILTER, OnCheckPrevfilter) 
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB_FILTER, OnSelchangeTabFilter) 
	ON_EN_CHANGE(IDC_EDIT_FILTER, OnChangeEditFilter) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CFilterDlg message handlers 
 
BOOL CFilterDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	 
	// TODO: Add extra initialization here 
	//创建内存图像 
	CreatMemImage(lpProcInfo); 
 
	if(lpProcInfo->sImageInfo .height sImageInfo .width sImageInfo .width -PREV_WIDTH)/2; 
	m_nPosy=(lpProcInfo->sImageInfo .height-PREV_HEIGHT)/2; 
	 
	_fnCOM_SetPos_xy(m_nPosx,m_nPosy); 
	Oldpoint.x=Oldpoint.y=-1; 
 
	m_curDown = LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_MOVE_DOWN)); 
	m_curUp = LoadCursor(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDC_MOVE_UP)); 
	m_curNormal=GetCursor(); 
 
	m_wndFilterBar.SubclassDlgItem(IDC_LINETRACK_FILTER, this); 
	m_wndFilterBar.InitControl(IDC_EDIT_FILTER,RGB(0,0,0),0, m_nStrength,200,1); 
//	m_wndFilterBar.SetDisabled (); 
//	DWORD dwStyle=GetWindowLong((HWND)m_wndFilterBar.GetDlgItem (IDC_LINETRACK_FILTER),GWL_STYLE); 
//	dwStyle+=WS_DISABLED; 
//	SetWindowLong((HWND)m_wndFilterBar.GetDlgItem (IDC_LINETRACK_FILTER),GWL_STYLE,dwStyle); 
 
	m_wndLogo.SubclassDlgItem (IDC_LOGO_FILTER,this); 
	m_wndLogo.SetLogoFont ("SIMSUN"); 
	m_wndLogo.SetLogoText ("iSee特效滤镜"); 
 
	InitDraw(); 
	InitCombo(); 
 
	if(m_TabInfo.GetItemCount()!=3) 
	{ 
		m_TabInfo.InsertItem (0,"高通滤波"); 
		m_TabInfo.InsertItem (1,"中值滤波"); 
		m_TabInfo.InsertItem (2,"低通滤波"); 
		m_TabInfo.InsertItem (3,"自定义"); 
	} 
	m_wndFilterBar.ShowWindow (SW_SHOWNORMAL); 
		 
//	GetDlgItem(IDC_BUTTON_EDIT)->ShowWindow(SW_SHOWNORMAL); 
	m_ButEdit.EnableWindow (FALSE); 
	KillTimer(1); 
	SetTimer(1,DELAYTIME,NULL); 
 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CFilterDlg::OnOK()  
{ 
	// TODO: Add extra validation here 
	KillTimer(1); 
	BeginWaitCursor (); 
	ClearPreView(); 
 
	CDialog::OnOK(); 
	Filter(); 
 
	EndWaitCursor (); 
} 
 
void CFilterDlg::OnCancel()  
{ 
	// TODO: Add extra cleanup here 
	KillTimer(1); 
	ClearPreView(); 
	Del(lpProcInfo->_pdbdata ); 
 
	CDialog::OnCancel(); 
} 
 
void CFilterDlg::Filter() 
{ 
	static int nSelect=m_Combo_Stype.GetCurSel(); 
 
	switch(m_nFilter) 
	{ 
	case 0: 
		switch(nSelect) 
		{ 
		case 0: 
//			 _fnCOM_Convolute(lpProcInfo,1,100,&HP1); 
			 _fnCOM_HighFilter(lpProcInfo,m_nStrength,0); 
			break; 
		case 1: 
			_fnCOM_Convolute(lpProcInfo,1,m_nStrength,&HP1); 
			break; 
		case 2: 
			_fnCOM_Convolute(lpProcInfo,1,m_nStrength,&HP2); 
			break; 
		case 3: 
			_fnCOM_Convolute(lpProcInfo,1,m_nStrength,&HP3); 
			break; 
 
		} 
		break; 
	case 1: 
		_fnCOM_MedianFilter(lpProcInfo,m_nStrength,nSelect); 
		break; 
	case 2: 
		switch(nSelect) 
		{ 
		case 0: 
			 _fnCOM_Convolute(lpProcInfo,1,m_nStrength,&LP1); 
			break; 
		case 1: 
			 _fnCOM_Convolute(lpProcInfo,1,m_nStrength,&LP2); 
			break; 
		case 2: 
			 _fnCOM_Convolute(lpProcInfo,1,m_nStrength,&LP3); 
			break; 
		} 
		break; 
	case 3: 
		switch(m_Combo_Stype.GetCurSel()) 
		{ 
		case 0: 
			break; 
		case 1: 
			break; 
		case 2: 
			break; 
		case 3: 
			break; 
		case 4: 
			break; 
		case 5: 
			break; 
		case 6: 
			break; 
		case 7: 
			break; 
		case 8: 
			break;		 
		} 
		break; 
 
	} 
} 
 
void CFilterDlg::InitCombo() 
{ 
	m_Combo_Stype.ResetContent (); 
	switch(m_nFilter) 
	{ 
	case 0: 
		m_Combo_Stype.AddString ("清晰画面-[强度无效]"); 
		m_Combo_Stype.AddString ("高通滤波1"); 
		m_Combo_Stype.AddString ("高通滤波2"); 
		m_Combo_Stype.AddString ("高通滤波3"); 
//		GetDlgItem(IDC_STATIC_FILTER)->SetWindowText("强度:"); 
		m_ButEdit.EnableWindow (FALSE); 
 
		break; 
	case 1: 
		m_Combo_Stype.AddString ("中间值-[去斑点]"); 
		m_Combo_Stype.AddString ("最小值"); 
		m_Combo_Stype.AddString ("最大值"); 
//		GetDlgItem(IDC_STATIC_FILTER)->SetWindowText("半径:"); 
		m_ButEdit.EnableWindow (FALSE); 
 
		break; 
	case 2: 
		m_Combo_Stype.AddString ("低通滤波1"); 
		m_Combo_Stype.AddString ("低通滤波2"); 
		m_Combo_Stype.AddString ("低通滤波3"); 
//		GetDlgItem(IDC_STATIC_FILTER)->SetWindowText("强度:"); 
		m_ButEdit.EnableWindow (FALSE); 
		break; 
	case 3: 
		m_Combo_Stype.AddString ("自定义风格1"); 
		m_Combo_Stype.AddString ("自定义风格2"); 
		m_Combo_Stype.AddString ("自定义风格3"); 
		m_Combo_Stype.AddString ("自定义风格4"); 
		m_Combo_Stype.AddString ("自定义风格5"); 
		m_Combo_Stype.AddString ("自定义风格6"); 
		m_Combo_Stype.AddString ("自定义风格7"); 
		m_Combo_Stype.AddString ("自定义风格8"); 
		m_Combo_Stype.AddString ("自定义风格9"); 
 
		m_ButEdit.EnableWindow (); 
//		GetDlgItem(IDC_STATIC_FILTER)->SetWindowText("强度:"); 
		break; 
	} 
	m_Combo_Stype.SetCurSel (0); 
} 
 
void CFilterDlg::PreView() 
{ 
	switch(m_nFilter) 
	{ 
	case 0: 
		switch(m_Combo_Stype.GetCurSel()) 
		{ 
		case 0:	 
			_fnCOM_HighFilterPreView(m_nStrength,0); 
			break; 
		case 1: 
			 _fnCOM_AdjustConvolutePreView(1,m_nStrength,&HP1); 
			break; 
		case 2: 
			_fnCOM_AdjustConvolutePreView(1,m_nStrength,&HP2); 
			break; 
		case 3: 
			_fnCOM_AdjustConvolutePreView(1,m_nStrength,&HP3); 
			break; 
		} 
		break; 
	case 1: 
		_fnCOM_MedianFilterPreView(m_nStrength,m_Combo_Stype.GetCurSel()); 
		break; 
	case 2: 
		switch(m_Combo_Stype.GetCurSel()) 
		{ 
		case 0: 
			 _fnCOM_AdjustConvolutePreView(1,m_nStrength,&LP1); 
			break; 
		case 1: 
			 _fnCOM_AdjustConvolutePreView(1,m_nStrength,&LP2); 
			break; 
		case 2: 
			 _fnCOM_AdjustConvolutePreView(1,m_nStrength,&LP3); 
			break; 
		} 
		break; 
	case 3: 
		switch(m_Combo_Stype.GetCurSel()) 
		{ 
		case 0: 
			break; 
		case 1: 
			break; 
		case 2: 
			break; 
		case 3: 
			break; 
		case 4: 
			break; 
		case 5: 
			break; 
		case 6: 
			break; 
		case 7: 
			break; 
		case 8: 
			break;		 
		} 
		break; 
	} 
	GetDlgItem (IDC_PRVIEW_FILTER)->InvalidateRect (NULL,TRUE); 
	GetDlgItem (IDC_PRVIEW_FILTER)->UpdateWindow(); 
} 
 
void CFilterDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if(m_Check_PreView==TRUE) 
		_fnCOM_DrawResizePrView(nIDCtl,lpDrawItemStruct); 
	else 
		_fnCOM_DrawPrView(nIDCtl,lpDrawItemStruct); 
 
	CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct); 
} 
 
void CFilterDlg::OnSelchangeComboFilter()  
{ 
	// TODO: Add your control notification handler code here 
	KillTimer(1); 
	SetTimer(1,DELAYTIME,NULL); 
} 
 
void CFilterDlg::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	PreView(); 
 
	switch(nIDEvent) 
	{ 
	case 1: 
		KillTimer(1); 
		break; 
	} 
 
	CDialog::OnTimer(nIDEvent); 
} 
 
void CFilterDlg::OnPaint()  
{ 
	CPaintDC dc(this); // device context for painting 
	 
	// TODO: Add your message handler code here 
	CRect rcClient; 
	GetClientRect(rcClient); 
 
	// draw scale 
	if (m_MemDC.GetSafeHdc() == NULL) 
	{ 
		m_MemDC.CreateCompatibleDC(&dc); 
		m_Bitmap.CreateCompatibleBitmap(&dc,rcClient.Width(),rcClient.Height()); 
		m_MemDC.SelectObject(m_Bitmap); 
		 
		// draw scale 
		m_MemDC.SetBkColor(RGB(255,255,255)); 
		CBrush bkBrush; 
		bkBrush.CreateSysColorBrush(COLOR_ACTIVEBORDER); 
		m_MemDC.FillRect(rcClient,&bkBrush); 
	} 
	if (m_MemDC.GetSafeHdc() != NULL) 
		dc.BitBlt(0, 0, rcClient.Width(), rcClient.Height(), &m_MemDC, 0, 0, SRCCOPY); 
 
	// Do not call CDialog::OnPaint() for painting messages 
} 
 
void CFilterDlg::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if(point.x>LEFT && point.xTOP &&  
		point.yLEFT && point.xTOP &&  
		point.ysImageInfo.width-PREV_WIDTH+3 && m_nPosx>=0) 
		{ 
			m_nPosx=_fnCOM_GetPosx()-x; 
		} 
		else if(m_nPosx>=lpProcInfo->sImageInfo.width-PREV_WIDTH+3 && x>=0) 
		{ 
			m_nPosx=_fnCOM_GetPosx()-x; 
		} 
		else if(m_nPosx<=0 && x<0) 
		{ 
			m_nPosx=_fnCOM_GetPosx()-(point.x-Oldpoint.x); 
		} 
 
		if(m_nPosysImageInfo.height -PREV_HEIGHT && m_nPosy>=0) 
		{ 
			m_nPosy=_fnCOM_GetPosy()+y; 
		} 
		else if(m_nPosy>=lpProcInfo->sImageInfo.height -PREV_HEIGHT && y<0) 
		{ 
			m_nPosy=_fnCOM_GetPosy()+y; 
		} 
		else if(m_nPosy<0 && y>=0) 
		{ 
			m_nPosy=_fnCOM_GetPosy()+y; 
		} 
 
		if(lpProcInfo->sImageInfo.height>PREV_HEIGHT && lpProcInfo->sImageInfo.width>PREV_WIDTH) 
		{ 
			if(m_nPosx<=lpProcInfo->sImageInfo.width-PREV_WIDTH+3 && 
				m_nPosx>=0 && m_nPosy<=lpProcInfo->sImageInfo.height -PREV_HEIGHT && 
				m_nPosy>=0) 
			{ 
				_fnCOM_SetPos_xy(m_nPosx,m_nPosy); 
			} 
		} 
		else if(lpProcInfo->sImageInfo.height>PREV_HEIGHT && lpProcInfo->sImageInfo.width<=PREV_WIDTH) 
		{ 
			if(m_nPosysImageInfo.height -PREV_HEIGHT && 
				m_nPosy>=0) 
			{ 
				_fnCOM_SetPos_xy(m_nPosx,m_nPosy); 
			} 
		} 
		else if(lpProcInfo->sImageInfo.height<=PREV_HEIGHT && lpProcInfo->sImageInfo.width>PREV_WIDTH) 
		{ 
			if(m_nPosx<=lpProcInfo->sImageInfo.width-PREV_WIDTH+3 && 
				m_nPosx>=0 ) 
			{ 
				_fnCOM_SetPos_xy(m_nPosx,m_nPosy); 
			} 
		} 
		Oldpoint.x=point.x; 
		Oldpoint.y=point.y; 
 
		GetDlgItem (IDC_PRVIEW_FILTER)->InvalidateRect (NULL,TRUE); 
		GetDlgItem (IDC_PRVIEW_FILTER)->UpdateWindow(); 
		KillTimer(1); 
		SetTimer(1,DELAYTIME,NULL); 
	} 
	else if(m_Check_PreView==FALSE && m_bMouseShow==TRUE && m_bMouseDown==FALSE &&  
		point.x>LEFT && point.xTOP &&  
		point.yInvalidateRect (NULL,TRUE); 
	GetDlgItem (IDC_PRVIEW_FILTER)->UpdateWindow(); 
	CRect rcClient; 
	rcClient.left=LEFT; 
	rcClient.top =TOP; 
	rcClient.right =LEFT+PREV_WIDTH+3; 
	rcClient.bottom =TOP+PREV_HEIGHT+3; 
	InvalidateRect (rcClient,TRUE); 
	UpdateWindow(); 
 
	KillTimer(1); 
	SetTimer(1,DELAYTIME,NULL); 
 
} 
 
void CFilterDlg::OnSelchangeTabFilter(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	m_nFilter=m_TabInfo.GetCurSel (); 
	InitCombo(); 
	KillTimer(1); 
	SetTimer(1,DELAYTIME,NULL); 
 
	*pResult = 0; 
} 
 
void CFilterDlg::OnChangeEditFilter()  
{ 
	// TODO: If this is a RICHEDIT control, the control will not 
	// send this notification unless you override the CDialog::OnInitDialog() 
	// function and call CRichEditCtrl().SetEventMask() 
	// with the ENM_CHANGE flag ORed into the mask. 
	 
	// TODO: Add your control notification handler code here 
	UpdateData(); 
	m_nStrength=atoi(m_strFilter); 
	m_nStrength=atoi(m_strFilter); 
 
	if(m_nStrength>200) 
	{ 
		m_nStrength=200; 
	} 
 
	m_wndFilterBar.SetPos (m_nStrength); 
	KillTimer(1); 
	SetTimer(1,DELAYTIME,NULL); 
 
	UpdateData(FALSE); 
}