Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Региональный поиск метод квадрантного дерева / src / DlgListPoint
.cpp// DlgListPoint.cpp : implementation file
//
#include <string.h>
#include "stdafx.h"
#include "QTree.h"
#include "QTreeView.h"
#include "QTreeDoc.h"
#include "MainFrm.h"
#include "DlgListPoint.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//карта сообщений окна
BEGIN_MESSAGE_MAP(CDlgListPoint, CDialog)
//{{AFX_MSG_MAP(CDlgListPoint)
ON_BN_CLICKED(IDC_BTNDELETEALL, OnDeleteAll)
ON_BN_CLICKED(IDC_BTNDELETE, OnBtndelete)
ON_BN_CLICKED(IDC_BTNADDOK, OnBtnaddok)
ON_BN_CLICKED(IDC_BTNADDCANCEL, OnBtnaddcancel)
ON_BN_CLICKED(IDC_BTNADD, OnBtnadd)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDlgListPoint dialog
//конструктор
CDlgListPoint::CDlgListPoint(CWnd* pParent)
: CDialog(CDlgListPoint::IDD, pParent)
{
}
//инициализации структур диалогового окна
BOOL CDlgListPoint::OnInitDialog()
{
CDialog::OnInitDialog();
//получаем указатель на список
CListBox *listpoints=(CListBox*)GetDlgItem(IDC_LISTPOINTS);
//получаем указатель на объект "представление"
CMainFrame *pMainFrame=(CMainFrame*)AfxGetApp()->GetMainWnd();
CQTreeView *pView=(CQTreeView*)pMainFrame->GetActiveView();
//получаем указатель на список точек
m_listpoints=pView->listPoints;
char str[20]; //для формирования выводимой строки списка
int Index; //индекс строки
//перебираем все точки и отображаем их в окне
for(m_listpoints.First();!m_listpoints.isHead();m_listpoints.Next())
{
ELEMENT *p=m_listpoints.Val();
wsprintf(str,"X=%i,Y=%i",(int)p->x,(int)p->y);
Index=listpoints->AddString(str);
listpoints->SetItemDataPtr(Index,m_listpoints.GetCurrentNode());
};
return TRUE;
}
//отображает главные кнопки окна (вспомогательная функция)
void CDlgListPoint::ShowMainBtns(void)
{
//массив идентификаторов отображаемых кнопок
UINT ID_showBtn[]={IDC_BTNADD,
IDC_BTNDELETE,
IDC_BTNDELETEALL,
IDOK,
IDCANCEL};
//массив идентификаторов скрываемых кнопок
UINT ID_hideBtn[]={IDC_BTNADDOK,
IDC_BTNADDCANCEL};
//массив идентификаторов скрываемых элементов редактирования
UINT ID_hideEdt[]={IDC_EDITX,
IDC_EDITY};
//массив идентификаторов скрываемых статических элементов
UINT ID_hideStc[]={IDC_STATICX,
IDC_STATICY};
CButton *btn;
CEdit *edt;
CStatic *stc;
//скрываем одни кнопки
for(int i=0;i<sizeof(ID_hideBtn)/sizeof(UINT);i++)
{
btn=(CButton*)GetDlgItem(ID_hideBtn[i]);
btn->ShowWindow(SW_HIDE);
};
//... и отображаем другие
for(i=0;i<sizeof(ID_showBtn)/sizeof(UINT);i++)
{
btn=(CButton*)GetDlgItem(ID_showBtn[i]);
btn->ShowWindow(SW_SHOW);
};
//скрываем элементы редактирования
for(i=0;i<sizeof(ID_hideEdt)/sizeof(UINT);i++)
{
edt=(CEdit*)GetDlgItem(ID_hideEdt[i]);
edt->ShowWindow(SW_HIDE);
};
//скрываем статические элементы
for(i=0;i<sizeof(ID_hideStc)/sizeof(UINT);i++)
{
stc=(CStatic*)GetDlgItem(ID_hideStc[i]);
stc->ShowWindow(SW_HIDE);
};
};
//удаление всех точек
void CDlgListPoint::OnDeleteAll()
{
//очищаем окно, отображающее список всех точек
CListBox *listpoints=(CListBox*)GetDlgItem(IDC_LISTPOINTS);
listpoints->ResetContent();
//удаляем все точки
for(m_listpoints.First();!m_listpoints.isHead();m_listpoints.Next())
{
m_listpoints.Remove();
}
}
//удаление выделенной в списке точки
void CDlgListPoint::OnBtndelete()
{
//получаем указатель на список
CListBox *listpoints=(CListBox*)GetDlgItem(IDC_LISTPOINTS);
//получаем индекс выделенного элемента в списке
int CurIndex=listpoints->GetCurSel();
if (CurIndex==-1) //если элемент не выделен, то выдаем сообщение
{
MessageBeep((WORD)-1);
MessageBox("For delete you must select some element!",
"Error");
return;
}
//ищем в списке точек указанную точку
for(m_listpoints.First();
m_listpoints.GetCurrentNode()!=(ListNode*)listpoints->GetItemDataPtr(CurIndex);
m_listpoints.Next());
//удаляем ее из одного списка
m_listpoints.Remove();
//... и из другого
listpoints->DeleteString(CurIndex);
}
//ввод новых значений
void CDlgListPoint::OnBtnadd()
{
//массив идентификаторов скрываемых кнопок
UINT ID_hideBtn[]={IDC_BTNADD,
IDC_BTNDELETE,
IDC_BTNDELETEALL,
IDOK,
IDCANCEL};
//массив идентификаторов отображаемых кнопок
UINT ID_showBtn[]={IDC_BTNADDOK,
IDC_BTNADDCANCEL};
//массив идентификаторов отображаемых элементов редактирования
UINT ID_showEdt[]={IDC_EDITX,
IDC_EDITY};
//массив идентификаторов отображаемых статических элементов
UINT ID_showStc[]={IDC_STATICX,
IDC_STATICY};
CButton *btn;
CEdit *edt;
CStatic *stc;
//скрываем одни кнопки
for(int i=0;i<sizeof(ID_hideBtn)/sizeof(UINT);i++)
{
btn=(CButton*)GetDlgItem(ID_hideBtn[i]);
btn->ShowWindow(SW_HIDE);
};
//... и отображаем другие
for(i=0;i<sizeof(ID_showBtn)/sizeof(UINT);i++)
{
btn=(CButton*)GetDlgItem(ID_showBtn[i]);
btn->ShowWindow(SW_SHOW);
};
//отображаем элементы редактирования
for(i=0;i<sizeof(ID_showEdt)/sizeof(UINT);i++)
{
edt=(CEdit*)GetDlgItem(ID_showEdt[i]);
edt->ShowWindow(SW_SHOW);
};
//отображаем статические элементы
for(i=0;i<sizeof(ID_showStc)/sizeof(UINT);i++)
{
stc=(CStatic*)GetDlgItem(ID_showStc[i]);
stc->ShowWindow(SW_SHOW);
};
//переводим фокус ввода на первый элемент редактирования
edt=(CEdit*)GetDlgItem(IDC_EDITX);
edt->SetFocus();
}
//принять ввод новых значений
void CDlgListPoint::OnBtnaddok()
{
//отображаем главные кнопки диалогового окна
ShowMainBtns();
//в переменные strX и strY считываем введенные пользователем значения
char strX[5],strY[5];
CEdit *edt;
edt=(CEdit*)GetDlgItem(IDC_EDITX);
edt->GetLine(0,strX);
edt->SetWindowText("");
edt=(CEdit*)GetDlgItem(IDC_EDITY);
edt->GetLine(0,strY);
edt->SetWindowText("");
//текстовые значения переводим в целочисленные
int X=atoi(strX);
int Y=atoi(strY);
//добавляем новую точку в общий список точек
ELEMENT p;
p.x=(POINTTYPE)X;
p.y=(POINTTYPE)Y;
m_listpoints.Append(new ELEMENT(p));
//ищем в списке точек данную точку
for(m_listpoints.Last();
*m_listpoints.Val()!=p;
m_listpoints.Prev());
//отображаем ее в списке окна
char str[20];
wsprintf(str,"X=%i,Y=%i",X,Y);
CListBox *listpoints=(CListBox*)GetDlgItem(IDC_LISTPOINTS);
int Index=listpoints->AddString(str);
listpoints->SetItemDataPtr(Index,m_listpoints.GetCurrentNode());
}
//отменить ввод новых значений
void CDlgListPoint::OnBtnaddcancel()
{
//отображаем главные кнопки диалогового окна
ShowMainBtns();
//очищаем области ввода
CEdit *edt;
edt=(CEdit*)GetDlgItem(IDC_EDITX);
edt->SetWindowText("");
edt=(CEdit*)GetDlgItem(IDC_EDITY);
edt->SetWindowText("");
}
//подтверждение окончания редакторования
void CDlgListPoint::OnOK()
{
//получаем указатель на объект "представление"
CMainFrame *pMainFrame=(CMainFrame*)AfxGetApp()->GetMainWnd();
CQTreeView *pView=(CQTreeView*)pMainFrame->GetActiveView();
//вносим изменения в исходный сисок точек
pView->listPoints=m_listpoints;
//удаляем результаты последнего поиска
while(pView->listPointsInRect.Lenght()>0)
{
pView->listPointsInRect.First();
pView->listPointsInRect.Remove();
}
//отменяем режим демонстрации дерева вследствии
//необходимости его изменения
pView->m_ShowQTree=FALSE;
CQTreeDoc *pDoc=pView->GetDocument();
//обновляем данные документа
pDoc->listPoints=m_listpoints;
pDoc->SetModifiedFlag();
//обновляем экран
pView->Invalidate();
CDialog::OnOK();
}
//отмена всех изменений
void CDlgListPoint::OnCancel()
{
//здесь мы ничего не делаем, так как пользователь
//отменил все изменения, внесенные им в список точек
CDialog::OnCancel();
}
Соседние файлы в папке src