- •Введение
- •Описание предметной области
- •Обоснование принимаемых решений по выбору технических и программных средств реализации проекта.
- •Функциональное моделирование
- •Информационное моделирование
- •Описание руководства пользователя
- •Тестирование системы и описание полученных результатов
- •Приложение а
- •Приложение б
- •Список использованных источников.
- •Программная реализация (листинг программных модулей с пояснениями)
Тестирование системы и описание полученных результатов
Приложение является диалоговым и при запуске можно увидеть его главное окно (рис. 2).
Рис. 2. Главное окно приложения
В строке соединения указывается строка коннекта к MS SQL SERVER
Структура приложения состоит из главного окна и нескольких диалоговых.
На главном окне размещается информация обо всех финансовых показателях, содержащихся в данный момент в БД (рис. 2.). Кнопка «Добавить» используется для добавления записей в БД. При ее нажатии появляется диалоговое окно, показанное на рис. 3. Заполнив соответствующие поля информацией об издании необходимо нажать клавишу «OK», и информация о платежеспособности поместится в БД.
Рис. 3. Окно добавления оценки в БД
Рис. 4. Окно добавления предприятия в БД
С помощью функции «Поиск» (рис. 5) можно производить поиск по БД. Необходимо указать код оценки. После нажатия кнопки «Поиск» информация о найденных оценках будет размещена в списке.
Кнопка «Удалить» напротив списка оценок удаляет выбранную оценку из БД. (рис 6.)
Кнопка «Удалить предприятие» удаляет выбранную предприятие с оценкой(!) из БД.
С помощью функции «РАСЧЕТ можно рассчитать индекс прибыльности. ВНИМАНИЕ ! для корректной работы функции ГРАФИК необходимо предварительно рассчитать ДВЕ оценки с помощью выбора соотвествующей оценки в списке и нажатия кнопки РАСЧЕТ.
С помощью функции «График» (рис. 7) можно построить график по ДВУМ оценкам. Для корректной работы этой функции необходимио предварительно рассчитать ДВЕ оценки с помощью выбора соответствующей оценки в списке и нажатия кнопки РАСЧЕТ.
Рис. 5. Поиск по БД
Рис 6. Удаление оценки из БД
Рис 7. График оценок
Рис 8. Сохранение результатов в файл out.txt
Приложение а
Схема обобщенного алгоритма работы программы
Приложение б
Схема алгоритма работы метода
Список использованных источников.
Грегори К. Использование Visual C++ 6.0. Специальное издание / К. Грегори – М.: Вильямс, 2002.
Дейт К. Дж. Введение в системы баз данных / К. Дж. Дейт – Киев: Диалектика, 1998.
Кириллов В.В. Основы проектирования реляционных баз данных [Электронный ресурс] – Режим доступа - http://www.cit-forum.com.
Кузнецов С. Д. Основы современных баз данных [Электронный ресурс] – Режим доступа - http://www.cit-forum.com.
Либерти Д. Освой самостоятельно С++ / Д. Либерти – М.: Вильямс, 2001.
Рихтер Д. Windows для профессионалов / Д. Рихтер – СПб.: Питер, 2003.
Страуструп Бьерн Язык программирования С++. Специальное издание / Б. Страуструп – М.: BINOM, 2002.
Шеферд Д. Программирование на Microsoft Visual C++ .NET / Д. Шеферд – М.: Русская редакция, 2003. – 928
Программная реализация (листинг программных модулей с пояснениями)
// DIALOG_MAIN.cpp : implementation file
//
#include "stdafx.h"
#include "ProfitabilityIndex.h"
#include "DIALOG_MAIN.h"
#include "ProfitabilityIndex.h"
#include "ProfitabilityIndexDlg.h"
#include "DIALOG_ADD.h"
#include "DialogFind2.h"
#include "DialogGraph.h"
#include "Dialog_ADD2.h"
#include "MyCRec2.h"
//#include "MyLibrary.h"
//#include "DIALOG_MAIN.h"
//#include "MyLibraryDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDIALOG_MAIN dialog
CDIALOG_MAIN::CDIALOG_MAIN(CWnd* pParent /*=NULL*/)
: CDialog(CDIALOG_MAIN::IDD, pParent)
, m_ConnectionString(_T(""))
{
//{{AFX_DATA_INIT(CDIALOG_MAIN)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CDIALOG_MAIN::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDIALOG_MAIN)
// NOTE: the ClassWizard will add DDX and DDV calls here
DDX_Control(pDX, IDC_LIST1, m_main_list2);
//}}AFX_DATA_MAP
DDX_Text(pDX, IDC_EDIT1, m_ConnectionString);
}
BEGIN_MESSAGE_MAP(CDIALOG_MAIN, CDialog)
//{{AFX_MSG_MAP(CDIALOG_MAIN)
ON_BN_CLICKED(IDC_BUTTON_GOODS_ADD, OnButtonGoodsAdd)
ON_BN_CLICKED(IDC_BUTTON_GOODS_DEL, OnButtonGoodsDel)
ON_BN_CLICKED(IDC_BUTTON_GOODS_EDIT, OnButtonGoodsEdit)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BUTTON_HELP, &CDIALOG_MAIN::OnBnClickedButtonHelp)
ON_BN_CLICKED(IDC_BUTTON_FIND, &CDIALOG_MAIN::OnBnClickedButtonFind)
ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, &CDIALOG_MAIN::OnLvnColumnclickList1)
ON_BN_CLICKED(IDC_BUTTON_GRAPH, &CDIALOG_MAIN::OnBnClickedButtonGraph)
ON_BN_CLICKED(IDC_BUTTON_COUNT_INDEX_PROF, &CDIALOG_MAIN::OnBnClickedButtonCountIndexProf)
ON_BN_CLICKED(IDC_BUTTON_SAVE_INFILE, &CDIALOG_MAIN::OnBnClickedButtonSaveInfile)
//ON_BN_CLICKED(IDC_BUTTON_CONNECT_TODB, &CDIALOG_MAIN::OnBnClickedButtonConnectTodb)
ON_BN_CLICKED(IDC_BUTTON_ADD_FACTORY, &CDIALOG_MAIN::OnBnClickedButtonAddFactory)
ON_BN_CLICKED(IDC_BUTTON_DEL_FACTORY, &CDIALOG_MAIN::OnBnClickedButtonDelFactory)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDIALOG_MAIN message handlers
/*void CDIALOG_MAIN::OnButtonEditMain()
{
CDIALOG_ADD editbutton;
if (IDOK == editbutton.DoModal())
{
}
}
void CDIALOG_MAIN::OnButtonAddMain()
{
CDIALOG_ADD addbutton;
if (IDOK == addbutton.DoModal())
{
}
FillList();
}*/
void CDIALOG_MAIN::FillList()
{
CString tmp;
CDBVariant v;
LV_ITEM item;
item.mask = LVIF_TEXT;
int i=0;
CDatabase* m_mdb;
TEXTMETRIC tm;
m_main_list2.DeleteAllItems();
// Delete all of the columns.
int nColumnCount = m_main_list2.GetHeaderCtrl()->GetItemCount();
for (int k=0;k < nColumnCount;k++)
{
m_main_list2.DeleteColumn(0);
}
//Filling Columns and draw gridlines
GetDC()->GetTextMetrics(&tm);
ListView_SetExtendedListViewStyle(m_main_list2.m_hWnd, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
m_main_list2.InsertColumn(0,_T("Предприятие"),LVCFMT_LEFT,20*tm.tmAveCharWidth);
m_main_list2.InsertColumn(1,_T("Индекс прибыльности"),LVCFMT_LEFT,30*tm.tmAveCharWidth);
m_main_list2.InsertColumn(2,_T("Чистые приведенные денежные потоки проекта"),LVCFMT_LEFT,30*tm.tmAveCharWidth);
m_main_list2.InsertColumn(3,_T("Первоначальные затраты"),LVCFMT_LEFT,30*tm.tmAveCharWidth);
//Get pointer of the main window
CProfitabilityIndexDlg * mDlg = (CProfitabilityIndexDlg *)AfxGetMainWnd();
m_mdb=mDlg->m_db;
MyCRec rs(m_mdb);
MyCRec2 rs2(m_mdb);
//SELECT [PInd],[NPV],[Co] FROM [ProfitabilityIndex].[dbo].[PIndex]
//rs.Open(CRecordset::snapshot,"SELECT * FROM PIndex;",CRecordset::readOnly);
rs.Open(CRecordset::snapshot,"SELECT [PInd],[NPV],[Co] FROM [ProfitabilityIndex].[dbo].[PIndex];",CRecordset::readOnly);
rs2.Open(CRecordset::snapshot,"SELECT [name] FROM [ProfitabilityIndex].[dbo].[Factory];",CRecordset::readOnly);
while (!rs.IsEOF() || !rs2.IsEOF())
{
item.iItem = i;
item.iSubItem = 0;
item.pszText="";
m_main_list2.InsertItem(&item);
if(!rs2.IsEOF())
{
rs2.GetFieldValue("name",v);
CStringA* nm = v.m_pstringA;
m_main_list2.SetItemText(i,0,(LPSTR)nm->GetBuffer());
}
if (!rs.IsEOF())
{
rs.GetFieldValue("PInd",v);
tmp.Format("%d",v.m_iVal);
m_main_list2.SetItemText(i,1,tmp);
rs.GetFieldValue("NPV",v);
tmp.Format("%d",v.m_iVal);
m_main_list2.SetItemText(i,2,tmp);
rs.GetFieldValue("Co",v);
tmp.Format("%d",v.m_iVal);
m_main_list2.SetItemText(i,3,tmp);
}
if (!rs.IsEOF())
rs.MoveNext();
if(!rs2.IsEOF())
rs2.MoveNext();
i++;
}
// i=0;
// while (!rs2.IsEOF())
// {
// item.iItem = i;
// item.iSubItem = 0;
// item.pszText="";
// m_main_list2.InsertItem(&item);
//
// rs2.GetFieldValue("name",v);
// CStringA* nm = v.m_pstringA;
// m_main_list2.SetItemText(i,0,(LPSTR)nm->GetBuffer());
// rs2.MoveNext();
// }
rs.Close();
rs2.Close();
}
BOOL CDIALOG_MAIN::OnInitDialog()
{
CDialog::OnInitDialog();
m_ConnectionString = _T("Driver=SQL SERVER;Server=localhost\\SQLEXPRESS;Database=ProfitabilityIndex;User ID=;Password=;Trusted_Connection=False;");
UpdateData(FALSE);
//FillList();//Filling List
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
static BOOL bAscending=TRUE;
static int last_nCol=-1;
static int numzap;
BOOL CDIALOG_MAIN::ListSorting(int nCol, BOOL bAscending, int low, int high)
{
CListCtrl* pm_lc;
pm_lc=&m_main_list2;
CHeaderCtrl* pHeader = (CHeaderCtrl*) m_main_list2.GetDlgItem(0);
int kol_stb = pHeader->GetItemCount();
if( nCol >= kol_stb )
return FALSE;
if( high == -1 ) high = pm_lc->GetItemCount() - 1;
int lo = low;
int hi = high;
CString midItem;
if( hi <= lo ) return FALSE;
midItem = pm_lc->GetItemText( (lo+hi)/2, nCol );
// loop through the list until indices cross
while( lo <= hi )
{
// rowText will hold all column text for one row
CStringArray rowText;
// find the first element that is greater than or equal to
// the partition element starting from the left Index.
if( bAscending )
while( ( lo < high ) && ( pm_lc->GetItemText(lo, nCol) < midItem ) )
++lo;
else
while( ( lo < high ) && ( pm_lc->GetItemText(lo, nCol) > midItem ) )
++lo;
// find an element that is smaller than or equal to
// the partition element starting from the right Index.
if( bAscending )
while( ( hi > low ) && ( pm_lc->GetItemText(hi, nCol) > midItem ) )
--hi;
else
while( ( hi > low ) && ( pm_lc->GetItemText(hi, nCol) < midItem ) )
--hi;
// if the indexes have not crossed, swap
// and if the items are not equal
if( lo <= hi )
{
// swap only if the items are not equal
if( pm_lc->GetItemText(lo, nCol) != pm_lc->GetItemText(hi, nCol))
{
// swap the rows
LV_ITEM lvitemlo, lvitemhi;
int nColCount = kol_stb;
rowText.SetSize( nColCount );
int i;
for( i=0; i<nColCount; i++)
rowText[i] = pm_lc->GetItemText(lo, i);
lvitemlo.mask = LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
lvitemlo.iItem = lo;
lvitemlo.iSubItem = 0;
lvitemlo.stateMask = LVIS_CUT | LVIS_DROPHILITED |
LVIS_FOCUSED | LVIS_SELECTED |
LVIS_OVERLAYMASK | LVIS_STATEIMAGEMASK;
lvitemhi = lvitemlo;
lvitemhi.iItem = hi;
pm_lc->GetItem( &lvitemlo );
pm_lc->GetItem( &lvitemhi );
for( i=0; i<nColCount; i++)
pm_lc->SetItemText(lo, i, pm_lc->GetItemText(hi, i));
lvitemhi.iItem = lo;
pm_lc->SetItem( &lvitemhi );
for( i=0; i<nColCount; i++)
pm_lc->SetItemText(hi, i, rowText[i]);
lvitemlo.iItem = hi;
pm_lc->SetItem( &lvitemlo );
}
++lo;
--hi;
}
}
// If the right index has not reached the left side of array
// must now sort the left partition.
if( low < hi )
ListSorting( nCol, bAscending , low, hi);
// If the left index has not reached the right side of array
// must now sort the right partition.
if( lo < high )
ListSorting( nCol, bAscending , lo, high );
return TRUE;
}
void CDIALOG_MAIN::OnColumnclickList2(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
int nCol = pNMListView->iSubItem;
int low = 0, high = -1;
if(last_nCol!=nCol)
last_nCol=nCol;
else
if(last_nCol==nCol)
bAscending=!bAscending;
ListSorting(nCol, bAscending, low, high);
if(numzap!=0)
//recount();
*pResult = 0;
}
void CDIALOG_MAIN::OnButtonLoad()
{
FillList();
}
void CDIALOG_MAIN::OnButtonGoodsAdd()
{
// TODO: Add your control notification handler code here
CDIALOG_ADD addDialog;
int nItem = 0;
POSITION pos = m_main_list2.GetFirstSelectedItemPosition();
if (pos == NULL)
{
TRACE(_T("No items were selected!\n"));
}
else
{
while (pos)
{
nItem = m_main_list2.GetNextSelectedItem(pos);
}
}
if (IDOK == addDialog.DoModal())
{
addDialog.AddGoods(nItem);
}
FillList();
}
void CDIALOG_MAIN::OnButtonGoodsDel()
{
POSITION pos = m_main_list2.GetFirstSelectedItemPosition();
int index_del;
CDBVariant v;
CDatabase* m_pDB;
CProfitabilityIndexDlg * m_pDlg = (CProfitabilityIndexDlg *)AfxGetMainWnd();
m_pDB = m_pDlg->m_db;
index_del =(int)pos-1;
CRecordset rs(m_pDB);
rs.Open(CRecordset::dynaset,"SELECT [PInd],[NPV],[Co] FROM [ProfitabilityIndex].[dbo].[PIndex];",CRecordset::dynamic);
rs.Move(index_del);
rs.Delete();
rs.MoveFirst();
rs.Close();
FillList();
}
void CDIALOG_MAIN::OnButtonGoodsEdit()
{
CDIALOG_ADD addDialog;
CDBVariant v;
CDatabase* m_pDB;
CProfitabilityIndexDlg * m_pDlg = (CProfitabilityIndexDlg *)AfxGetMainWnd();
m_pDB = m_pDlg->m_db;
CRecordset rs(m_pDB);
rs.Open(CRecordset::dynaset,"SELECT [PInd],[NPV],[Co] FROM [ProfitabilityIndex].[dbo].[PIndex];",CRecordset::dynamic);
int nItem = 0;
POSITION pos = m_main_list2.GetFirstSelectedItemPosition();
if (pos == NULL)
{
TRACE(_T("No items were selected!\n"));
}
else
{
while (pos)
{
nItem = m_main_list2.GetNextSelectedItem(pos);
}
}
rs.Move(nItem);
//rs.Edit();
rs.GetFieldValue("NPV",v);
addDialog.m_nNPV = v.m_iVal;
rs.GetFieldValue("Co",v);
addDialog.m_nCo = v.m_iVal;
if (IDOK == addDialog.DoModal())
{
addDialog.EditGoods(nItem);
}
FillList();
}
void CDIALOG_MAIN::OnBnClickedButtonHelp()
{
// TODO: добавьте свой код обработчика уведомлений
::ShellExecute(0,0,_T("explorer.exe"),_T("HelpContent.htm"),0,SW_SHOW);
}
void CDIALOG_MAIN::OnBnClickedButtonFind()
{
// TODO: добавьте свой код обработчика уведомлений
CDialogFind2 findDialog;
if (IDOK == findDialog.DoModal())
{
}
}
void CDIALOG_MAIN::OnLvnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
int nCol = pNMListView->iSubItem;
int low = 0, high = -1;
if(last_nCol!=nCol)
last_nCol=nCol;
else
if(last_nCol==nCol)
bAscending=!bAscending;
ListSorting(nCol, bAscending, low, high);
if(numzap!=0)
//recount();
*pResult = 0;
}
void CDIALOG_MAIN::OnBnClickedButtonGraph()
{
// TODO: добавьте свой код обработчика уведомлений
CDialogGraph dlg;
dlg.m_nPInd1 = m_nPInd1;
dlg.m_nPInd2 = m_nPInd2;
dlg.DoModal();
}
void CDIALOG_MAIN::OnBnClickedButtonCountIndexProf()
{
int PInd;
CDatabase* m_mdb;
CDBVariant v;
int i=0;
//Get pointer of the main window
CProfitabilityIndexDlg * mDlg = (CProfitabilityIndexDlg *)AfxGetMainWnd();
m_mdb=mDlg->m_db;
CRecordset rs(m_mdb);
rs.Open(CRecordset::dynaset,"SELECT [PInd],[NPV],[Co] FROM [ProfitabilityIndex].[dbo].[PIndex];",CRecordset::dynamic);
int nItem = 0;
POSITION pos = m_main_list2.GetFirstSelectedItemPosition();
if (pos == NULL)
{
TRACE(_T("No items were selected!\n"));
}
else
{
while (pos)
{
nItem = m_main_list2.GetNextSelectedItem(pos);
}
}
rs.Move(nItem);
rs.GetFieldValue("NPV",v);
int NPV = v.m_iVal;
rs.GetFieldValue("Co",v);
int Co = v.m_iVal;
PInd=NPV/Co;
if(nItem == 0)
m_nPInd1 = PInd;
else
m_nPInd2 = PInd;
Updatem_PInd(nItem, PInd);
FillList();// TODO: добавьте свой код обработчика уведомлений
}
bool CDIALOG_MAIN::Updatem_PInd(int RecordPos, int nVal)
{
CDatabase* m_mdb;
CDBVariant v;
int i=0;
long pos,l;
//Get pointer of the main window
CProfitabilityIndexDlg * mDlg = (CProfitabilityIndexDlg *)AfxGetMainWnd();
m_mdb=mDlg->m_db;
MyCRec rs(m_mdb);
rs.m_nFields=4;
rs.Open(CRecordset::dynaset,"SELECT [PInd] FROM [ProfitabilityIndex].[dbo].[PIndex];",CRecordset::dynamic);
rs.Move(RecordPos);
rs.Edit();
rs.m_nPInd = nVal;
rs.Update();
rs.Close();
return true;
}
void CDIALOG_MAIN::OnBnClickedButtonSaveInfile()
{
CProfitabilityIndexDlg * mDlg = (CProfitabilityIndexDlg *)AfxGetMainWnd();
CDatabase* m_mdb;
m_mdb=mDlg->m_db;
CDBVariant v;
int i=0;
CString tmp, str_out;
CFile file;
CFileException e;
file.Open("out.txt",CFile::modeCreate | CFile::modeWrite, &e);
MyCRec rs(m_mdb);
rs.Open(CRecordset::snapshot,"SELECT [PInd],[NPV],[Co] FROM [ProfitabilityIndex].[dbo].[PIndex];",CRecordset::readOnly);
while (!rs.IsEOF())
{
rs.GetFieldValue("PInd",v);
tmp.Format("%d",v.m_iVal);
str_out = tmp + " ";
rs.GetFieldValue("NPV",v);
tmp.Format("%d",v.m_iVal);
str_out += (tmp + " ");
rs.GetFieldValue("Co",v);
tmp.Format("%d",v.m_iVal);
str_out += (tmp + "\r\n");
file.Write(str_out,str_out.GetLength());
rs.MoveNext();
i++;
}
file.Close();
rs.Close();
}
void CDIALOG_MAIN::OnBnClickedButtonConnectTodb()
{
// TODO: добавьте свой код обработчика уведомлений
}
void CDIALOG_MAIN::OnBnClickedButtonAddFactory()
{
// TODO: добавьте свой код обработчика уведомлений
CDIALOG_ADD2 addDialog;
if (IDOK == addDialog.DoModal())
{
UpdateData(TRUE);
CProfitabilityIndexDlg * mDlg = (CProfitabilityIndexDlg *)AfxGetMainWnd();
CDatabase* m_mdb;
m_mdb=mDlg->m_db;
MyCRec2 rs(m_mdb);
rs.m_nFields=1;
rs.Open(CRecordset::dynaset,"SELECT [name] FROM [ProfitabilityIndex].[dbo].[Factory];",CRecordset::dynamic);
if(rs.CanAppend())
{
rs.AddNew();
}
rs.m_sName = addDialog.m_sName;
rs.Update();
rs.Close();
}
FillList();
}
void CDIALOG_MAIN::OnBnClickedButtonDelFactory()
{
// TODO: добавьте свой код обработчика уведомлений
POSITION pos = m_main_list2.GetFirstSelectedItemPosition();
int index_del;
CDBVariant v;
CDatabase* m_pDB;
CProfitabilityIndexDlg * m_pDlg = (CProfitabilityIndexDlg *)AfxGetMainWnd();
m_pDB = m_pDlg->m_db;
index_del =(int)pos-1;
CRecordset rs(m_pDB);
rs.Open(CRecordset::dynaset,"SELECT [id],[PInd],[NPV],[Co],[id_factory] FROM [ProfitabilityIndex].[dbo].[PIndex];",CRecordset::dynamic);
CRecordset rs2(m_pDB);
rs2.Open(CRecordset::dynaset,"SELECT * FROM [ProfitabilityIndex].[dbo].[Factory];",CRecordset::dynamic);
rs.Move(index_del);
rs.Delete();
rs.MoveFirst();
rs.Close();
rs2.Move(index_del);
rs2.Delete();
rs2.MoveFirst();
rs2.Close();
FillList();
}
// DIALOG_FIND.cpp : implementation file
//
#include "stdafx.h"
#include "ProfitabilityIndex.h"
#include "DIALOG_FIND.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDIALOG_FIND dialog
CDIALOG_FIND::CDIALOG_FIND(CWnd* pParent /*=NULL*/)
: CDialog(CDIALOG_FIND::IDD, pParent)
{
//{{AFX_DATA_INIT(CDIALOG_FIND)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CDIALOG_FIND::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDIALOG_FIND)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDIALOG_FIND, CDialog)
//{{AFX_MSG_MAP(CDIALOG_FIND)
// NOTE: the ClassWizard will add message map macros here
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDIALOG_FIND message handlers