На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Как разумно ограничить размер диалога?
    да да живите в своём мире :D
    все уже давно придумано, layout рулит
    Сообщение отредактировано: Cfon -
      Цитата ЫукпШ @

      Вопрос был о том, "как ограничить размер диалога ?"
      При изменении размеров окна в оконную процедуру
      посылается сообщение WM_SIZE с установленными размерами.
      По этому событию можно сравнить установленные размеры с ограничениями и,
      если надо, установить допустимые размеры окна

      Как раз по этому событию ты ничего особо сделать с окном не можешь, Либо это будет работать дико коряво.
      WM_WINDOWPOSCHANGING вызывается до изменения и в нем ты можешь вернуть новые размеры окна, т.е. ограничить размер диалога, а заодно изменить контролы. Больше никаких сообщений обрабатывать не нужно, В том числе getminmax
        Цитата ЫукпШ @
        посылается сообщение WM_SIZE с установленными размерами.
        По этому событию можно сравнить установленные размеры с ограничениями и,
        если надо, установить допустимые размеры окна.


        А что, после сет виндов поз снова WM_SIZE не вызовется? :whistle:

        Не совсем хорошая практика, как по мне.
          Цитата barazuk @
          Цитата ЫукпШ @
          посылается сообщение WM_SIZE с установленными размерами.
          По этому событию можно сравнить установленные размеры с ограничениями и,
          если надо, установить допустимые размеры окна.


          А что, после сет виндов поз снова WM_SIZE не вызовется? :whistle:

          Обязательно вызовется - а как же иначе.
          Но новые правильно установленные размеры окна окажутся
          в допустимых пределах по их размерам.
          Это значит, что "SetWindowPos" вызвана не будет, ибо незачем.
          Никакого "автогенератора" не получится.

          Добавлено
          Олег М, WM_WINDOWPOSCHANGING это как раз результат работы SetWindowPos.
          ссылка
          Из обработчика этого сообщения я бы эту функцию вызвать не рискнул.
            Цитата ЫукпШ @
            Олег М, WM_WINDOWPOSCHANGING это как раз результат работы SetWindowPos.
            ссылка
            Из обработчика этого сообщения я бы эту функцию вызвать не рискнул

            Кто ж ее там вызывает? Там в параметрах сообщения можно вернуть новый размер окна
              Цитата Олег М @
              Там в параметрах сообщения можно вернуть новый размер окна

              Да вернуть-то можно, но не всегда.
              WM_WINDOWPOSCHANGING - это прямое следствие SetWindowPos.
              Но эта функция используется не только для изменения размеров окна.
              Значит, надо ещё правильно отфильтровать флаги. Возникает также вопрос - а что
              будет, если размер окна поменять другой функцией WINAPI ?
              (Напрмер, MoveWindow)
              ---
              Алгоритм процедуры в WM_SIZE проще, всё действует по-факту попытки изменить именно
              размеры окна неважно чем, неважно как.
                Цитата ЫукпШ @
                Да вернуть-то можно, но не всегда

                А когда нельзя?

                Добавлено
                Цитата ЫукпШ @
                Возникает также вопрос - а что
                будет, если размер окна поменять другой функцией WINAPI ?
                (Напрмер, MoveWindow)

                Будет отправлено это сообщение. Оно всегда отправляется, при изменении позиции или размера окна.
                  Цитата Олег М @
                  Цитата ЫукпШ @
                  Да вернуть-то можно, но не всегда

                  А когда нельзя?

                  Эта функция используется не только для изменения размеров окна.
                  И вместо размеров может быть любой мусор.
                  ---
                  А что будет, если в новых версиях Виндус будут добавлены новые флаги ?
                  Может быть алгоритм снова придётся переделывать..
                  Нет, не уговоришь.
                  Работать по-факту происходящего всегда надёжнее.
                    Цитата ЫукпШ @
                    Нет, не уговоришь.
                    Работать по-факту происходящего всегда надёжнее.

                    Кто ж тебя уговаривает? Тебе рассказывают как надо делать правильно. Не доходит, ну и ладно.
                      Цитата Олег М @
                      Цитата ЫукпШ @
                      Нет, не уговоришь.
                      Работать по-факту происходящего всегда надёжнее.

                      Кто ж тебя уговаривает? Тебе рассказывают как надо делать правильно. Не доходит, ну и ладно.

                      Ты даже не знал, что в указанном тобой сообщении размеры
                      окна пересылаются не всегда.
                      И при этом рассказываешь, "как надо правильно".
                        Цитата ЫукпШ @
                        И при этом рассказываешь, "как надо правильно".


                        Идеологически правильно обрабатывать OnGetMinMaxInfo. Он вызывается ПЕРЕД любым изменением размера, и специально для этого предназначен :)

                        А изменение размера из WM_SIZE... Это костыль
                          Цитата ЫукпШ @
                          Ты даже не знал, что в указанном тобой сообщении размеры
                          окна пересылаются не всегда.
                          И при этом рассказываешь, "как надо правильно".


                          С чего ты решил, что не знал? Вот мой код, от 2001 года вроде

                          ExpandedWrap disabled
                            void CScopeDlg::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
                            {
                                CDialog::OnWindowPosChanging(lpwndpos);
                                if (GetMinSize()==CSize(0,0)) return;
                             
                                if (!(lpwndpos->flags & SWP_NOSIZE))
                                {
                                    CSize sz(lpwndpos->cx,lpwndpos->cy);
                                    ApplyAnchors(this,GetMinSize(),sz,__anchors);
                                    lpwndpos->cx=sz.cx;
                                    lpwndpos->cy=sz.cy;
                                }
                            }


                          А вот цитата из MSDN, насчёт WM_WINDOWPOSCHANGING

                          While this message is being processed, modifying any of the values in WINDOWPOS affects the window's new size, position, or place in the Z order. An application can prevent changes to the window by setting or clearing the appropriate bits in the flags member of WINDOWPOS.
                            Цитата barazuk @
                            Идеологически правильно обрабатывать OnGetMinMaxInfo. Он вызывается ПЕРЕД любым изменением размера, и специально для этого предназначен :)

                            В свое время писал специальный класс, Layout, на который можно накидывать контролы, которые будут перемещаться и изменять размер, в зависимости от размеров диалога. Именно через OnGetMinMaxInfo ЕМНИП это и делал. Все работало и до сих пор работает гдето далеко уверен что на ура :-?
                              Цитата KILLER @
                              В свое время писал специальный класс, Layout, на который можно накидывать контролы, которые будут перемещаться и изменять размер, в зависимости от размеров диалога.

                              а щас используешь его?
                                Цитата Cfon @
                                а щас используешь его?

                                А щас я уже с MFC и WinApi не работал пару лет уже. Ну так то помню что да как работает, какие то конкретные вещи через гугл за пару секунд гуглятся. :-?

                                Добавлено
                                Если не забуду могу как до дома доберусь, посмотреть конкретно через какие функции я делал. Там класс практически для тех же целей что и у ТС. Единственное там возможно еще и отрисовка кастомных контролов запилена, я уж и не помню.
                                Сообщение отредактировано: KILLER -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0415 ]   [ 16 queries used ]   [ Generated: 27.04.24, 07:28 GMT ]