Читаем Программирование на Visual C++. Архив рассылки полностью

А. Увы, это не так элементарно делается, как, скажем, в C++ Builder. Но и здесь есть свои плюсы – вы получаете больший контроль. Пусть, скажем, у Вас есть кнопка, которую Вам нужно выровнять по правому краю, и соответствующая переменная m_Btn типа CButton в классе вашего окна или вида. Тогда в функции обработки сообщения WM_SIZE – OnSize.

void CMyView::OnSize(UINT nType, int cx, int cy) {

 CFormView::OnSize(nType, cx, cy);

 .

 .

 // ... добавьте вот это:

 if (::IsWindow(m_Btn.m_hWnd)) // условие на корректность

  m_Btn.MoveWindow(cx - BtnWidth - 10, BtnY, cx - 10, BtnY + BtnHeight, 0); // двигаем кнопку

 // конец кода для добавления.

 .

 .

}

Здесь вместо BtnY вставьте желаемую Y-координату кнопки, BtnWidth и BtnHeight – соответственно целевые ширина и высота кнопки.

Параметр  cx,  передаваемый  в функцию - это новая ширина окна. Данный код изменяет положение кнопки, чтобы она оставалась ширины Btn_Width и отстояла  от  правого  края  окна  на  10 единиц. Функция MoveWindow меняет размер и положение кнопки. Если вы не знаете BtnY|Width|Height, то  их  можно определить с помощью функции m_btn.GetClientRect, ведь любой элемент управления - это, в принципе, тоже окно.

Выравнивание по нижнему краю производится аналогично, просто по смыслу меняются параметры MoveWindow.


Ну вот, на сегодня пока все. Жду ваших писем с замечаниями, предложениями и пожеланиями. До скорого!

(C) 2000 by Алекс Jenter mailto:jenter@mail.ru.

Программирование на Visual C++

Выпуск №2 от 20/6/2000

Приветствую вас, уважаемые подписчики!

Очень рад, что число вас растет, несмотря на то, что рассылка еще не вышла из категории "Рассылки для каждого" и не была официально анонсирована. Если новоподписавшимся интересно узнать, о чем мы в рассылке беседуем, они могут посмотреть в архиве первый выпуск.

Сегодня мы немного поговорим об устройстве MFC, а также рассмотрим один интересный вопрос.

НЕМНОГО ТЕОРИИ

Как известно, основой всех основ в MFC является класс CObject. Основным назначением этого класса является предоставление некоторых базовых возможностей всем своим наследникам, а именно доступ к информации о классе во время выполнения и поддержка сериализации, т.е. сохраняемости объектов.

Однако уровень предоставляемых возможностей варьируется в зависимости от вашего выбора; он зависит от включения определенных макросов объявления и реализации при создании классов – наследников CObject. Без сомнения, вы с этими макросами уже сталкивались, например в коде, который генерируют Wizard'ы. Пришла пора разобраться с ними более детально.

Итак, на характер вашего класса, производного от CObject, вы можете влиять с помощью нескольких макросов. Существуют определенные пары макросов — один включается в объявление класса (имеет префикс DECLARE_), а соответствующий ему — в реализацию (префикс IMPLEMENT_).

Первая пара макросов — это DECLARE_DYNAMIC|IMPLEMENT_DYNAMIC. С помощью включения этих макросов в код вашего класса вы можете включить одну из базовых функций CObject — способность узнавать класс объекта прямо во время выполнения программы. Для этого вы можете пользоваться функцией IsKindOf в связке с макросом RUNTIME_CLASS, который возвращает указатель на структуру CRuntimeClass (где хранится вся информация о классе: имя, размер, версия, информация о базовом классе, указатель на конструктор объекта и т.д.)

Следующая пара — DECLARE_DYNCREATE|IMPLEMENT_DYNCREATE аналогична первой, но к возможности получать информацию о классе добавляется еще и  возможность создавать объекты этого класса во время выполнения.

Объект создается функцией CreateObject структуры CRuntimeClass. Вот пример:

CRunTimeClasspClass = RUNTIME_CLASS(СMyObject);

 // получаем ук-ль на структуру CRunTimeClass

CObjectpNewObject= pClass->CreateObject;

 // создаем новый объект нужного класса

ASSERT(pNewObject->IsKindOf(RUNTIME_CLASS(CMyObject));

 // проверяем класс объекта

И, наконец, мы подошли к последней паре макросов DECLARE_SERIAL| IMPLEMENT_SERIAL.  Преобразование в последовательную форму и обратно — сериализация — дает программисту возможность сохранения и восстановления  объектов. Для того, чтобы воспользоваться этой возможностью, в классе-наследнике нужно перекрыть виртуальную функцию Serialize.

Перейти на страницу:

Похожие книги

Программист-прагматик. Путь от подмастерья к мастеру
Программист-прагматик. Путь от подмастерья к мастеру

Находясь на переднем крае программирования, книга "Программист-прагматик. Путь от подмастерья к мастеру" абстрагируется от всевозрастающей специализации и технических тонкостей разработки программ на современном уровне, чтобы исследовать суть процесса – требования к работоспособной и поддерживаемой программе, приводящей пользователей в восторг. Книга охватывает различные темы – от личной ответственности и карьерного роста до архитектурных методик, придающих программам гибкость и простоту в адаптации и повторном использовании.Прочитав эту книгу, вы научитесь:Бороться с недостатками программного обеспечения;Избегать ловушек, связанных с дублированием знания;Создавать гибкие, динамичные и адаптируемые программы;Избегать программирования в расчете на совпадение;Защищать вашу программу при помощи контрактов, утверждений и исключений;Собирать реальные требования;Осуществлять безжалостное и эффективное тестирование;Приводить в восторг ваших пользователей;Формировать команды из программистов-прагматиков и с помощью автоматизации делать ваши разработки более точными.

А. Алексашин , Дэвид Томас , Эндрю Хант

Программирование / Книги по IT
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ
Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ

Эта книга представляет собой перевод третьего издания американского бестселлера Effective C++ и является руководством по грамотному использованию языка C++. Она поможет сделать ваши программы более понятными, простыми в сопровождении и эффективными. Помимо материала, описывающего общую стратегию проектирования, книга включает в себя главы по программированию с применением шаблонов и по управлению ресурсами, а также множество советов, которые позволят усовершенствовать ваши программы и сделать работу более интересной и творческой. Книга также включает новый материал по принципам обработки исключений, паттернам проектирования и библиотечным средствам.Издание ориентировано на программистов, знакомых с основами C++ и имеющих навыки его практического применения.

Скотт Майерс , Скотт Мейерс

Программирование, программы, базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT