Этот код следует удалить в том случае, если вы вводите собственный код рисования. Указанные ниже координаты в точности соответствуют координатам, возвращаемым объектом CCntCntrltem, что создает эффект непосредственного редактирования.
удалите следующий код, если реализуете собственный код рисования.
if (m_pSelection NULL) {
POSITION pos pDoc-X3etStartPosition() m_pSelection (CCntCntrltem*) pDoc-XSetNextClientltern (pos); if (m_pSelection NULL)
m_pSelection->Draw(pDC, CRect(10, 10,210,210)); }
void CCntView::OnlnitialUpdate() CView::OnlnitialUpdate ();
Удалите следующий код, если реализуете собственный код инициализации.
m_pSelection NULL;
инициализация переменной, содержащей указатель на выделенный объект
// Печать документа
BOOL CCntView: :OnPreparePrinting (CPrintlnf о* plnfo) {
Стандартные действия по подготовке к печати return DoPreparePrinting (plnfo) ;
)
void CCntView:.-OnBeginPrinting (CDC* /*pDC*/, CPrintlnfo* /*plnfo*/) {
Добавьте код дополнительной инициализации перед печатью.
void CCntView::OnEndPrinting(CDC* /*pDC*/, CPrintlnfo*
/*plnfo*/)
{
Добавьте код очистки после печати.
}
void CCntView::OnDestroy() {
Деактивировать объект при удалении; это важно, если используется режим разделения окна просмотра.
CView::OnDestroy(); COleClientltem* pActiveltem GetDocument()->
GetlnPlaceActiveltem(this); if (pActiveltem NULL && pActive!tem-> GetActiveView() this) {
pActive!tem->DeactivateO; ASSERT(GetDocument()->
GetlnPlaceActiveltem(this) NULL);
}
}
// Поддержка OLE-клиентов
BOOL CCntView::IsSelected(const CObject* pDocItem)
const
{
// Представленная ниже реализация подходит, если // выделенными являются только объекты CCntCntrltem. // В противном случае данный код следует заменить. // Реализуйте функцию, которая проверяет тип // выделенного объекта.
return pDocItem m_pSelection; void CCntView::OnlnsertObject()
// Вызов стандартного диалогового окна InsertObject // для получения информации о новом объекте CCntCntrltem.
COlelnsertDialog dig;
if (dlg.DoModaK) IDOK) return;
BeginWaitCursor()
CCntCntrltem* pltem NULL;
TRY
Создаем новый объект, связанный с этим документом.
CCntDoc* pDoc GetDocument(); ASSERT_VALID(pDoc); pltem new CCntCntrltem(pDoc); ASSERT_VALID(pltem);
Инициализация объекта на основании данных, полученных из диалогового окна.
if (!dig.Createltem(pltem)) AfxThrowMemoryException() ;
Подойдет исключение любого типа
ASSERT_VALID(pltem);
Если объект был выбран из списка классов, а не загружен из файла, запускаем сервер для редактирования объекта,
if (dig.GetSelectionType() COlelnsertDialog::createNew!tern) pitem->DoVerb(OLEIVERB_SHOW, this); ASSERT_VALID(pltem);
// Последний введенный объект выделяется. // Введите код, соответствующий требованиям // вашего приложения.
m_pSelection pltem;
// Указатель устанавливается на // последний введенный объект
pDoc->UpdateAHViews (NULL) CATCH(CException, e) if (pltem NULL) ASSERT_VALID(pltem) p!tem->Delete() AfxMessageBox(IDP_FAILEDJTO_CREATE); END_CATCH EndWaitCursor(); >
// Следующий обработчик позволяет с помощью клавиатуры // прерывать сеанс непосредственного редактирования. // Инициируется это контейнером, а не сервером,
voidCCntView::OnCancelEditCntr()
Редактируемый объект закрывается.
COleClientltem* pActiveltem= GetDocument()-> GetlnPlaceActiveltem(this); if (pActiveltem NULL) pActive!tem->Close();
ASSERT(GetDocument()->GetInPlaceActiveItem(this)
NULL);
}
Обработчики OnSetFocusn OnSize требуются контейнеру в случае непосредственного редактирования объекта.
void CCntView: :OnSetFocus (CWnd* pOldWnd) {
COleClientltem* pActiveltem GetDocument ( GetlnPlaceActiveltem(this) if (pActiveltem NULL && pActive!tem->GetItemState () COleClientltem: :activeUIState)
Фокус необходимо установить на объект, если он находится в той же области просмотра.
CWnd* pWnd pActiveltem- >GetInPlaceWindow(
if (pWnd NULL)
{
pWnd->SetFocus( ) ; // метод SetFocus базового класса
// не вызывается return; }}
CView::OnSetFocus(pOldWnd); }
void CCntView: :OnSize (UINT nType, int ex, int cy) {
CView: :OnSize (nType, ex, cy)
COleClientltem* pActiveltem GetDocument
GetlnPlaceActiveltem(this) if (pActiveltem NULL)
pActiveItem->SetItemRects
}
Диагностика класса CcntView tifdef _DEBUG
void CCntView: .-AssertValid() const {
CView::AssertValid();
void CCntView::Dump(CDumpContext Sdc) const CView::Dump(dp); }
CCntDoc* CCntView::GetDocument() // отладочная версия
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLAS S
(CCntDoc))); return (CCntDoc*)m_pDocument; #endlf // DEBUG
Обработчики сообщений класса CCntView
Чтобы приложение могло отображать внедренные объекты, были внесены изменения в функцию ОпБга\у( ). Обратите внимание на такой фрагмент:
if (т_рЗе1ес^оп !=NULL)
m_pSeleotion->Draw(рОС, CRectdO, 10,210, 210)); }
По умолчанию объект размещается в окне приложения в заранее заданной области, которая определяется конструктором СКесЦ ). Указанные координаты можно изменить вручную.
В файл были также добавлены функции Оп1пШа1ирс1а1е(), ЬБексЛесЮ, ЫгаелО^есЛО, ОпСапсе!Ес1кСтг(), ОпЗегРосшОИ Оп81ге(). В частности, функция ОЫшеПОфес^) вызывает стандартное диалоговое окно класса С01е1п5еПЕИа1о§, предназначенное для вставки объектов.
5. Файл CNTRITEM.CPP
Файл CNTRJ.TEM.CPP, листинг которого приведен ниже, содержит реализацию класса ССтСпггкет.
Сг^гЗ^ет. срр: реализация класса ССг^Сг^гЗ^ет
#include "stdafx.h" #include "Cnt.h" #include "CntDoc.h" #include "CntView.h" #include "Cntrltem.h" #ifdef JDEBUG #define new DEBUG_NEW tundef THIS_FILE
static char THIS_FILE[] FILE
#endif
// CcntCntrltem
IMPLEMENT__SERIAL (CCntCntrltem, С01еС11еп^ет, 0) CCntCntrltem: CCntCntrltem (СО^Иос* рСс^а1пег) C01eClientltem (pContainer)
здесь добавьте код конструктора.
ССп^п^^ега: :-ССп^п^^ет здесь добавьте код очистки.
void CCntCntrltem::OnChange(OLE_NOTIFICATTON nCode, DWORD dwParam)
ASSERT_VALID(this) COleClientltem::0nChange(nCode, dwParam);
Редактируемому объекту посылается уведомление OnChange,свидетельствующее об изменении его состояния или внешнего вида. Обозначьте рабочую область объекта как недействительную путем вызова функции UpdateAllViews.
GetDocument()->UpdateAlIViews(NULL)
BOOL CCntCntrltem::OnChangeltemPosition(const CRect SrectPos)
ASSERT_VALID(this) ;
В процессе непосредственного редактирования данная функция вызывается сервером для изменения позиции окна редактирования.
По умолчанию вызывается метод базового класса, который, в свою очередь, задействует функцию COleClientltem::SetltemRects для перемещения объекта в новую позицию.
if (!COleClientltem::OnChangeltemPosition(rectPos)) return FALSE;
обновите всю кэшированную информацию, связанную с размерами объекта.
return TRUE; )
void CCntCntrltem::OnGetItemPosition(CRect SrPosition) ASSERT_VALID(this) ;
В процессе непосредственного редактирования данная функция позволяет определить координаты области, занимаемой объектом.
По умолчанию заданы фиксированные координаты. Запишите правильные координаты (в пикселях) в переменную гPos ition.
rPosition.SetRect(10, 10,210, 210);
void CCntCntrltem: :OnActivate()
Допускается только один сеанс редактирования в окне приложения.
CCntView* pView GetActiveView ASSERT_VALID(pView)
COleClientltem* pltem GetDocument ( )
GetlnPlaceActiveltem(pView) if (pltem NULL
ss-pltem this)
p!tem->Close ()
COleClientltem: OnAct ivate
}
void CCntCntrltem: :OnDeactivateUI (BOOL bUndoable) COleClientltem: :OnDeactivateUI (bUndoable)
Скрывает объект, если он был активизирован обычным способом
DWORDdwMisc 0;
m_lpObject->GetMiscStatus (GetDrawAspect SdwMisc)
if (dwMisc & OLEMISC*_INSIDEOUT) DoVerb (OLEIVERB_HIDE, NULL) }
void CCntCntrltem: Serialize (CArchive Sar) ASSERT_VALID(this)
Вызов функции базового класса для считывания данных, связанных с объектом COleClientltem. При этом инициализируется указатель m_j>Document, возвращаемый функцией CCntCntrltem: :GetDocument, поэтому функцию базового класса лучше вызывать вначале.
COleClientltem: Serialize (ar) ;
Теперь сериализуем данные, специфичные для объекта
CCntCntrltem.
if (ar.IsStoringO {
здесь добавьте код сохранения.
else{
здесь добавьте код загрузки.
//Диагностика класса CcntCntrltem #if<fef _DEBUG
void CCntCntrltem: :AssertValid const
COleClientltem::&ssertValidO;
}
void CCntCntrltem: :Dump(CDumpContext1 &dc) const
COleClientltem::Dump(dc);
#endif
Основное назначение этого файла состоит в отслеживании координат и размеров области, занимаемой внедренным объектом. Обратите внимание на фрагмент, выделенный полужирным шрифтом. Именно здесь задаются координаты, о которых говорилось при рассмотрении файла CNTVIEW.CPP.
Литература
Иванова Г. С. Технология программирования. М.: Изд-во МГТУ им. Баумана, 2002.
Вельбицкий И. В. Технология программирования. Киев, 1984.
Грейди Буч, Джеймс Рамбо, Лйвар Джекобсон. UML руководство пользователя. М.: ДМ К, 2000.
А. Дин Леффингуэлл, Дон Уидриг. Принципы работы с требованиями к программному обеспечению. М.: Вильяме, 2002.
Дэвид С. Платт. Знакомство с Microsoft .NET. М.: Русская редакция, 2001.
Липаев В. В. Проектирование программных средств. М.: Высшая школа, 1990.
Майерс Г. Искусство тестирования программ. М.: Финансы и статистика, 1982.
Брукс Ф. Мифический человеко-месяц, или Как создаются программные системы. СПб.: Символ-Плюс, 1999.
Роберт Дж. Орберг. СОМ+ технология. Основы и программирование М.: Вильяме, 2000. 478 с.
Е. Yourdon. Who Has the Right Stuff? // Software Development. 1997. № 9.
Game, Weinberg. Exploring Requirements: Quality Before Design, 1989
Аджиев В. II Открытые системы. 1998. № 1.
Батенко Л. П. // Менеджмент и менеджер. 2003. № 3.
Марио Аписелла // Computerworld. 2000. № 16—17.
15. Davis.
Fifteen
Principles of Software Engineering // IEEE
Software. 1994. Vol.
11. № 6. P. 94-101.
Xd.BoehmA. Spiral Model of Software Development and Enhancement // Computer. 1988. Vol. 21. № 5. P. 61-72.
17. Good-Enough Software // Application Development Strategies. 1996. № 1.
Алистэр Коуберн, Лори Вильяме. Парное программирование: преимущества и недостатки.
Cusumano М., Selby R. How Microsoft Builds Software // Communications of the ACM. 1997. Vol. 40. № 6. P. 53—61.
Cusumano M., Selby R. Microsoft's Weaknesses in Software Development //American Programmer. 1997. Vol. 10. № 10.
KnepperS., Ichbiah D. The Making Microsoft. Prima Publishing, 1993
http://www.softportal.com/articles/item_txt.php?id=78 Кент Бек.
http://ergl.rU/archive/cs/tp/01.htm#P4 Лекции ВМиК. Технология программирования.
Ожегов С. И. Словарь русского языка. М.: Советская Энциклопедия, 1975.
Советский энциклопедический словарь. М.: Советская Энциклопедия, 1979.
Политехнический словарь / Гл. ред. акад. А. Ю. Ишлинский. 2-е изд. М.: Советская Энциклопедия, 1980.
Терри Кватрани. Визуальное моделирование с помощью Rational Rose 2002 и UML. М.: Вильяме, 2003.
VoasJ. The Software Quality Certification Triangle. Crosstalk, Nov. 1998. P 12-14.
McCabe T. J., Butler Ch. W Design complexity measurement and testing Communications of the ACM. 32, 12 (Dec. 1989). P. 1415-1425.
Макконнелл С. Совершенный код. СПб.: Питер, 2006.
Жоголев Е. А. Введение в технологию программирования (конспект лекций). М.: ДИАЛОГ-МГУ, 1994.
Уолш Б. Программирование на Бейсике. М.: Радио и связь, 1988.
Каляное Г. Н. Консалтинг при автоматизации предприятий (подходы, методы, средства). М.: СИНТЕГ, 1997.
Страуструп Б. Язык программирования С++. Киев: ДиаСофт, 1993.
Модели и структуры данных / В. Д. Далека, А. С. Деревянко, О. Г. Кравец, Л. Е. Тимановская. Харьков: ХГПУ, 2000.
ХъюзДж., Мичтом Дж. Структурный подход к программированию. М.: Мир, 1980. С. 29—71.
Жоголев Е. А. Технологические основы модульного программирования // Программирование. 1980. № 2. С. 44—49.
Holt R. С. Structure of Computer Programs: A Survey // Proceedings of the IEEE. 1975. 63(6). P. 879-893.
Майерс Г. Надежность программного обеспечения. M.: Мир, 1980. С. 92-113.
Зелковец М. Шоу А., ГэннонДж. Принципы разработки программного обеспечения. М.: Мир, 1982. С. 65—71.
Дал У., Дейкстра Э., Хоор К. Структурное программирование. М.: Мир, 1975. С. 7-19.
ЛеоненковА. В. Самоучитель UML. СПб.: BHV, 2006.
Крачтен Ф. Rational Unified Process: введение: третье издание. Издательство Addison-Wesley Professional, 2003.
Басе Л., Клементе П., Рик Кацман Р. Практическая архитектура программного обеспечения: второе издание. Addison Wesley, 2003.
Object Management Group Inc. Спецификация унифицированного языка моделирования OMG версия 1.5. Документ номер 03-03-01. Март 2003.
Мак-Говерн Джеймс и др. Практическое руководство по архитектуре корпораций. Prentice Hall, 2004.
Вендров А. М. CASE-технологии. Современные методы и средства проектирования информационных систем. М.: Финансы и статистика, 1998.
Пушников А. Ю. Введение в системы управления базами данных. Источник материала — Пушников А. Ю. Введение в системы управления базами данных. Часть 2. Нормальные формы отношений и транзакции: учеб. пособие. Изд-е Башкирского ун-та, 1999.
Структурный анализ при разработке программного обеспечения систем реального времени / В. А. Матьяш, А. В. Никанд-ров, В. А. Путилов, А. Е. Федоров, В. В. Фильчаков. Апатиты: КФ ПетрГУ, 1997.
Колдовский В. Разработка ПО: оценка результата // Компьютерное обозрение. 2006. 21 сент.