Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Слушай, дружище, зачем так мучиться с этим языком С++, ты ведь не Билл Гейтс. Возьми тот же Python и программируй, он кроссплатформенный, под Windows тоже работает. Я сам давно заметил: то что на Си пишешь в страницу кода, на питоне решается в одну-две строки. При том, питон намного проще, я его сам недавно изучил по видеокурсу вот этому. Кстати, автор отлично там объясняет. Буквально день-два и уже будешь писать на нём, чего не скажешь про сложный С++.

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, которое мы и обрабатывали.

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

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

<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS