Программирование на Visual C++. Архив рассылки - [2]
>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:[email protected].
Программирование на 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().
Из нее обязательно нужно сначала вызвать родительскую версию. Одна и та же функция используется как для сохранения, так и для восстановления объекта. Какую операцию нужно произвести, она определяет из своего единственного параметра ar типа CArchive. Вот пример:
>void CMyObject::Serialize(CArchive ar) {
> CObject::Serialize(ar); // вызываем версию базового класса
> if (ar.IsStoring()) // если сохраняем,
> {
> ar << something; // то сохранить что-то
> } else // а иначе
> {
> ar >> something; // восстановить
> }
>}
Заметьте, что DECLARE_SERIAL|IMPLEMENT_SERIAL помимо сериализации включают и те возможности, которые дают две первые пары — это естественно, ведь если вы восстанавливаете объект, то вам понадобится возможность создать его во время выполнения программы. Например, приложению нужно сохранять и восстанавливать некоторый набор объектов различного типа. А для вызова соответствующего конструктора при восстановлении объекта нужно знать его тип. Механизм сериализации сохраняет информацию об объекте вместе с теми данными, что вы записываете явно в функции Serialize().
Следующий вопрос поступил от одного из подписчиков:
Q При программировании элементов ActiveX, в этой технологии есть возможность структурного хранения данных на диске, т.е. создание в файле так называемых хранилищ и потоков (использование интерфейсов IStream и IStorage), проще говоря – представление файла данных в виде иерархической системы внутренних каталогов и файлов, которые там (в данном файле данных) имеют свои строковые имена. Есть ли в MFC возможность структурного хранения, скажем, используя объект класса CArchive в переопределяемой функции Serialize(CArchive) класса, производного от CDocument, ну и так далее? Конечно, этого можно добиться, создав свои собственные наработки (а как хороша эта идея, я имею в виду использование потоков и хранилищ), но все таки хочется знать, есть ли такие возможности в MFC, чтобы не тратить зря время.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.