А. Увы, это не так элементарно делается, как, скажем, в 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.<p>Программирование на Visual C++</p><p>Выпуск №2 от 20/6/2000</p>

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

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

Сегодня мы немного поговорим об устройстве 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.

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

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