C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Урок 16. Composite control - реагируем на изменение размера / Библиотека ATL / Visual C++

Visual C++. ATL
Урок 16. Composite control - реагируем на изменение размера

Сейчас мы с вами посмотрим, как сделать, чтобы наш компонент реагировал на изменения своего размера. а именно мы хотим сделать так, чтобы при изменении размера самого компонента находящиеся на нем элементы (например, текстовые поля) тоже меняли свой размер соответствующим образом.

Возмите за основу созданный на прошлом уроке компонент. Сейчас если вы будете менять его размер (например, на форме Visual Basic'а), то текстовые поля свой размер не меняют. Это не очень красиво, так что исправим это.

Нам следует добавить обработчик для сообщения Windows WM_SIZE. Для этого в контекстном меню компонента в окне Class View выбираем Add Windows Message Handler:

Добавление обработчика

В появившемся диалоговом окне выбирайте WM_SIZE, двойным щелчком перекидывайте его в правое окно и двойным же щелчком на перекинутом WM_SIZE открываем окно кода для редактирования. Обратите внимание, что этот обработчик имеет в том числе параметры типа WPARAM и LPARAM (именно в них передаются дополнительная информация о сообщениях Windows).

В заготовку для обработчика внесите следующий код:

    LRESULT OnSize(UINT uMsg, WPARAM wParam,
      LPARAM lParam, BOOL& bHandled)
    {
        // TODO : Add Code for message handler. Call DefWindowProc if necessary.
        // Получаем HWND наших текстовый полей.
      HWND edit1 = GetDlgItem(IDC_EDIT1);
      HWND edit2 = GetDlgItem(IDC_EDIT2);
      // Изменяем их расположение в соответствии с шириной компонента.
      ::SetWindowPos(edit1, NULL, 0, 0, LOWORD(lParam)-30, 25, SWP_NOMOVE);
      ::SetWindowPos(edit2, NULL, 0, 0, LOWORD(lParam)-30, 25, SWP_NOMOVE);
        return 0;
    }

Обратите внимание, как мы используем API-функцию SetWindowPos. Во-первых, мы последний параметр устновили в SWP_NOMOVE. Это означает, что третий и четвертый параметры (которые задают координаты левого верхнего угла) будут игнорироваться и наше текстовое поле не будет менять своего положения - а бедет менять только размер. И во-вторых, обратите внимание, как мы изменяем ширину нашего текстового поля - мы пишем LOWORD(lParam)-30. Тут LOWORD(lParam) - это ширина нашего компонента, из которой мы вычитаем 30 на поля - 15 с одной стороны и 15 с другой. То, что LOWORD(lParam) - это ширина нашего компонента, мы узнаем из справки на сообщение Windows WM_SIZE, которое мы и обрабатывали.

Теперь наши текстовые поля будут изменяться по ширине, если мы будм менять размеры нашего компонента:

Изменение ширины текстовых полей