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;
}