Скачиваний:
18
Добавлен:
01.05.2014
Размер:
8 Кб
Скачать
// 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