www.pudn.com > IFSEditor.rar > IFSSettingDlg.cpp


// IFSSettingDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "IFSEditor.h" 
#include "IFSSettingDlg.h" 
#include "IFSEditorDoc.h" 
#include "AddEditDlg.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CIFSSettingDlg dialog 
 
 
CIFSSettingDlg::CIFSSettingDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CIFSSettingDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CIFSSettingDlg) 
	m_dwHeight = 0; 
	m_szTitle = _T(""); 
	m_dwUnitLenX = 0; 
	m_dwUnitLenY = 0; 
	m_dwWidth = 0; 
	m_dwStartPosX = 0; 
	m_dwStartPosY = 0; 
	m_dwN = 0; 
	//}}AFX_DATA_INIT 
	m_dwHeight = 200; 
	m_dwWidth = 200; 
	m_dwUnitLenX = 200; 
	m_dwUnitLenY = 200; 
	m_dwStartPosX = 0; 
	m_dwStartPosY = 0; 
	m_dwN = 100000; 
	m_BackClr = RGB(0, 0, 0); 
	m_ForeClr = RGB(255, 255, 255); 
	m_IFSArray.SetSize(0, 1); 
	m_bCanSetTitle = FALSE; 
} 
 
 
void CIFSSettingDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CIFSSettingDlg) 
	DDX_Control(pDX, IDC_BKCLR, m_btnBackClr); 
	DDX_Control(pDX, IDC_LISTIFS, m_ListIFS); 
	DDX_Control(pDX, IDC_FRCLR, m_btnForeClr); 
	DDX_Control(pDX, IDC_EDIT, m_btnEdit); 
	DDX_Control(pDX, IDC_DELETE, m_btnDelete); 
	DDX_Control(pDX, IDC_ADD, m_btnAdd); 
	DDX_Text(pDX, IDC_EDITHEIGHT, m_dwHeight); 
	DDX_Text(pDX, IDC_EDITTITLE, m_szTitle); 
	DDX_Text(pDX, IDC_EDITUNITX, m_dwUnitLenX); 
	DDX_Text(pDX, IDC_EDITUNITY, m_dwUnitLenY); 
	DDX_Text(pDX, IDC_EDITWIDTH, m_dwWidth); 
	DDX_Text(pDX, IDC_EDITXPOS, m_dwStartPosX); 
	DDX_Text(pDX, IDC_EDITYPOS, m_dwStartPosY); 
	DDX_Text(pDX, IDC_EDITN, m_dwN); 
	//}}AFX_DATA_MAP 
} 
 
 
BEGIN_MESSAGE_MAP(CIFSSettingDlg, CDialog) 
	//{{AFX_MSG_MAP(CIFSSettingDlg) 
	ON_WM_DESTROY() 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDC_BKCLR, OnBkclr) 
	ON_BN_CLICKED(IDC_FRCLR, OnFrclr) 
	ON_BN_CLICKED(IDC_ADD, OnAdd) 
	ON_BN_CLICKED(IDC_EDIT, OnEdit) 
	ON_BN_CLICKED(IDC_DELETE, OnDelete) 
	ON_NOTIFY(NM_DBLCLK, IDC_LISTIFS, OnDblclkListifs) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CIFSSettingDlg message handlers 
 
BOOL CIFSSettingDlg::OnInitDialog()  
{ 
	CDialog::OnInitDialog(); 
	CDC ScreenDC, memdc; 
	CBitmap bmpBack; 
	CBitmap bmpFore; 
	CBitmap *pOldBmp; 
	CBrush ClrBrush; 
	CRect rt; 
 
	// Init doc-title ctrl 
	CEdit *pEdit = (CEdit *)GetDlgItem(IDC_EDITTITLE); 
	pEdit->SetReadOnly(!m_bCanSetTitle); 
 
	// Initialize List Ctrl 
	ListView_SetExtendedListViewStyle(m_ListIFS.GetSafeHwnd(), 
		LVS_EX_FULLROWSELECT | 
		LVS_EX_GRIDLINES | 
		LVS_EX_HEADERDRAGDROP | 
		LVS_EX_ONECLICKACTIVATE | 
		LVS_EX_UNDERLINEHOT); 
	m_ListIFS.InsertColumn(0, "Kxx", LVCFMT_LEFT, 66); 
	m_ListIFS.InsertColumn(1, "Kyx", LVCFMT_LEFT, 66); 
	m_ListIFS.InsertColumn(2, "Kxy", LVCFMT_LEFT, 66); 
	m_ListIFS.InsertColumn(3, "Kyy", LVCFMT_LEFT, 66); 
	m_ListIFS.InsertColumn(4, "Bx", LVCFMT_LEFT, 66); 
	m_ListIFS.InsertColumn(5, "By", LVCFMT_LEFT, 66); 
	m_ListIFS.InsertColumn(6, "Pi", LVCFMT_LEFT, 66); 
 
	// Insert items 
	int ItemCount = m_IFSArray.GetSize(); 
	CString szTemp; 
	LVITEM Item; 
	Item.mask = LVIF_TEXT; 
	for(Item.iItem = 0; Item.iItem < ItemCount; Item.iItem++) 
	{ 
		Item.iSubItem = 0; 
		if(m_IFSArray[Item.iItem].m_a < 0) 
		{ 
			szTemp.Format("%f", m_IFSArray[Item.iItem].m_a); 
		} 
		else 
		{ 
			szTemp.Format(" %f", m_IFSArray[Item.iItem].m_a); 
		} 
		Item.pszText = szTemp.GetBuffer(szTemp.GetLength()); 
		m_ListIFS.InsertItem(&Item); 
		szTemp.ReleaseBuffer(); 
 
		Item.iSubItem = 1; 
		if(m_IFSArray[Item.iItem].m_b < 0) 
		{ 
			szTemp.Format("%f", m_IFSArray[Item.iItem].m_b); 
		} 
		else 
		{ 
			szTemp.Format(" %f", m_IFSArray[Item.iItem].m_b); 
		} 
		Item.pszText = szTemp.GetBuffer(szTemp.GetLength()); 
		m_ListIFS.SetItem(&Item); 
		szTemp.ReleaseBuffer(); 
 
		Item.iSubItem = 2; 
		if(m_IFSArray[Item.iItem].m_c < 0) 
		{ 
			szTemp.Format("%f", m_IFSArray[Item.iItem].m_c); 
		} 
		else 
		{ 
			szTemp.Format(" %f", m_IFSArray[Item.iItem].m_c); 
		} 
		Item.pszText = szTemp.GetBuffer(szTemp.GetLength()); 
		m_ListIFS.SetItem(&Item); 
		szTemp.ReleaseBuffer(); 
 
		Item.iSubItem = 3; 
		if(m_IFSArray[Item.iItem].m_d < 0) 
		{ 
			szTemp.Format("%f", m_IFSArray[Item.iItem].m_d); 
		} 
		else 
		{ 
			szTemp.Format(" %f", m_IFSArray[Item.iItem].m_d); 
		} 
		Item.pszText = szTemp.GetBuffer(szTemp.GetLength()); 
		m_ListIFS.SetItem(&Item); 
		szTemp.ReleaseBuffer(); 
 
		Item.iSubItem = 4; 
		if(m_IFSArray[Item.iItem].m_e < 0) 
		{ 
			szTemp.Format("%f", m_IFSArray[Item.iItem].m_e); 
		} 
		else 
		{ 
			szTemp.Format(" %f", m_IFSArray[Item.iItem].m_e); 
		} 
		Item.pszText = szTemp.GetBuffer(szTemp.GetLength()); 
		m_ListIFS.SetItem(&Item); 
		szTemp.ReleaseBuffer(); 
 
		Item.iSubItem = 5; 
		if(m_IFSArray[Item.iItem].m_f < 0) 
		{ 
			szTemp.Format("%f", m_IFSArray[Item.iItem].m_f); 
		} 
		else 
		{ 
			szTemp.Format(" %f", m_IFSArray[Item.iItem].m_f); 
		} 
		Item.pszText = szTemp.GetBuffer(szTemp.GetLength()); 
		m_ListIFS.SetItem(&Item); 
		szTemp.ReleaseBuffer(); 
 
		Item.iSubItem = 6; 
		szTemp.Format("%f", m_IFSArray[Item.iItem].m_pi); 
		Item.pszText = szTemp.GetBuffer(szTemp.GetLength()); 
		m_ListIFS.SetItem(&Item); 
		szTemp.ReleaseBuffer(); 
	} 
 
	// Init Color Buttons 
	for(;ScreenDC.CreateDC("DISPLAY", NULL, NULL, NULL) == FALSE;); 
	memdc.CreateCompatibleDC(&ScreenDC); 
	m_btnBackClr.GetClientRect(rt); 
	rt.right -= 6; 
	rt.bottom -= 6; 
	bmpBack.CreateCompatibleBitmap(&ScreenDC, rt.Width(), rt.Height()); 
	m_btnForeClr.GetClientRect(rt); 
	rt.right -= 6; 
	rt.bottom -= 6; 
	bmpFore.CreateCompatibleBitmap(&ScreenDC, rt.Width(), rt.Height()); 
	pOldBmp = (CBitmap *)memdc.SelectObject(&bmpBack); 
	ClrBrush.CreateSolidBrush(m_BackClr); 
	memdc.FillRect(rt, &ClrBrush); 
	memdc.SelectObject(&bmpFore); 
	ClrBrush.DeleteObject(); 
	ClrBrush.CreateSolidBrush(m_ForeClr); 
	memdc.FillRect(rt, &ClrBrush); 
	memdc.SelectObject(pOldBmp); 
	memdc.DeleteDC(); 
	ScreenDC.DeleteDC(); 
	ClrBrush.DeleteObject(); 
	::DeleteObject(m_btnBackClr.SetBitmap((HBITMAP)bmpBack.Detach())); 
	::DeleteObject(m_btnForeClr.SetBitmap((HBITMAP)bmpFore.Detach())); 
 
	// Start A Timer 
	m_btnDelete.EnableWindow(FALSE); 
	m_btnEdit.EnableWindow(FALSE); 
	SetTimer(1, 50, NULL); 
	 
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
} 
 
void CIFSSettingDlg::OnDestroy()  
{ 
	CDialog::OnDestroy(); 
	 
	// TODO: Add your message handler code here 
	KillTimer(1); 
} 
 
void CIFSSettingDlg::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	if(nIDEvent == 1) 
	{ 
		if(m_ListIFS.GetNextItem(-1, LVNI_FOCUSED) >= 0) 
		{ 
			m_btnDelete.EnableWindow(); 
			m_btnEdit.EnableWindow(); 
		} 
		else 
		{ 
			m_btnDelete.EnableWindow(FALSE); 
			m_btnEdit.EnableWindow(FALSE); 
		} 
	} 
	CDialog::OnTimer(nIDEvent); 
} 
 
void CIFSSettingDlg::OnBkclr()  
{ 
	// Set background color 
	CColorDialog dlg(m_BackClr); 
	if(dlg.DoModal() == IDOK) 
	{ 
		m_BackClr = dlg.GetColor(); 
		CDC ScreenDC, memdc; 
		CBitmap bmpBack; 
		CBitmap *pOldBmp; 
		CBrush ClrBrush; 
		CRect rt; 
		m_btnBackClr.GetClientRect(rt); 
		rt.right -= 6; 
		rt.bottom -= 6; 
		for(;ScreenDC.CreateDC("DISPLAY", NULL, NULL, NULL) == FALSE;); 
		memdc.CreateCompatibleDC(&ScreenDC); 
		bmpBack.CreateCompatibleBitmap(&ScreenDC, rt.Width(), rt.Height()); 
		pOldBmp = (CBitmap *)memdc.SelectObject(&bmpBack); 
		ClrBrush.CreateSolidBrush(m_BackClr); 
		memdc.FillRect(rt, &ClrBrush); 
		memdc.SelectObject(pOldBmp); 
		memdc.DeleteDC(); 
		ScreenDC.DeleteDC(); 
		ClrBrush.DeleteObject(); 
		::DeleteObject(m_btnBackClr.SetBitmap((HBITMAP)bmpBack.Detach())); 
	} 
} 
 
void CIFSSettingDlg::OnFrclr()  
{ 
	// Set Foreground color 
	CColorDialog dlg(m_ForeClr); 
	if(dlg.DoModal() == IDOK) 
	{ 
		m_ForeClr = dlg.GetColor(); 
		CDC ScreenDC, memdc; 
		CBitmap bmpFore; 
		CBitmap *pOldBmp; 
		CBrush ClrBrush; 
		CRect rt; 
		m_btnForeClr.GetClientRect(rt); 
		rt.right -= 6; 
		rt.bottom -= 6; 
		for(;ScreenDC.CreateDC("DISPLAY", NULL, NULL, NULL) == FALSE;); 
		memdc.CreateCompatibleDC(&ScreenDC); 
		bmpFore.CreateCompatibleBitmap(&ScreenDC, rt.Width(), rt.Height()); 
		pOldBmp = (CBitmap *)memdc.SelectObject(&bmpFore); 
		ClrBrush.CreateSolidBrush(m_ForeClr); 
		memdc.FillRect(rt, &ClrBrush); 
		memdc.SelectObject(pOldBmp); 
		memdc.DeleteDC(); 
		ScreenDC.DeleteDC(); 
		ClrBrush.DeleteObject(); 
		::DeleteObject(m_btnForeClr.SetBitmap((HBITMAP)bmpFore.Detach())); 
	} 
} 
 
void CIFSSettingDlg::OnAdd()  
{ 
	// Add IFS Code 
	CAddEditDlg dlg; 
	int ItemCount = m_IFSArray.GetSize(); 
	double IdeaPi = 1.0; 
	for(int i=0; iSetFocus(); 
			return; 
		} 
		if(m_dwWidth < 1) 
		{ 
			MessageBox("图像宽度不应小于1!", NULL, MB_OK | MB_ICONWARNING); 
			GetDlgItem(IDC_EDITWIDTH)->SetFocus(); 
			return; 
		} 
		if(m_dwHeight < 1) 
		{ 
			MessageBox("图像高度不应小于1!", NULL, MB_OK | MB_ICONWARNING); 
			GetDlgItem(IDC_EDITHEIGHT)->SetFocus(); 
			return; 
		} 
		if(m_dwUnitLenX < 1) 
		{ 
			MessageBox("X方向单位长度不应小于1!", NULL, MB_OK | MB_ICONWARNING); 
			GetDlgItem(IDC_EDITUNITX)->SetFocus(); 
			return; 
		} 
		if(m_dwUnitLenY < 1) 
		{ 
			MessageBox("Y方向单位长度不应小于1!", NULL, MB_OK | MB_ICONWARNING); 
			GetDlgItem(IDC_EDITUNITY)->SetFocus(); 
			return; 
		} 
		double SumPi = 0.0; 
		for(int i=0; i 1.0) 
		{ 
			MessageBox("IFS码总概率不应大于1!", NULL, MB_OK | MB_ICONWARNING); 
			m_ListIFS.SetFocus(); 
			return; 
		} 
		else if(SumPi == 0.0) 
		{ 
			MessageBox("至少需要有一项概率不为0的IFS码!", NULL, MB_OK | MB_ICONWARNING); 
			m_ListIFS.SetFocus(); 
			return; 
		} 
		CDialog::OnOK(); 
	} 
} 
 
void CIFSSettingDlg::OnDblclkListifs(NMHDR* pNMHDR, LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	OnEdit(); 
	*pResult = 0; 
}