На главную Наши проекты:
Журнал   ·   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  все  ( Перейти к последнему сообщению )  
> Как разумно ограничить размер диалога?
    В очередной раз написал класс, который двигает и растягивает контролы при изменении размера диалога.

    Естественно, захотелось сделать так, чтобы диалог нельзя было сделать меньше определенного размера.

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

    Куски кода, имеющие отношение к делу:

    ExpandedWrap disabled
      *.h :
       
      class CBlackListManagerDlg : public CDialog
      {
      // Construction
      public:
      ....
          ControlMover cm;
      ....
       
      *.cpp:
       
      BOOL CBlackListManagerDlg::OnInitDialog()
      {
          CDialog::OnInitDialog();
          cm.Initialise(this);
       
          return TRUE;  // return TRUE  unless you set the focus to a control
      }
       
      void CBlackListManagerDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
      {
          // TODO: Add your message handler code here and/or call default
        if(cm.m_lWidth > 100){
          lpMMI->ptMinTrackSize = CPoint(cm.m_lWidth, 300);
        }
          
          CDialog::OnGetMinMaxInfo(lpMMI);
      }


    Ну и в самом мувере:
    ExpandedWrap disabled
      class ControlMover{
      public:
          LONG m_lWidth;
          LONG m_lHeight;
       
          void Initialise(CWnd* pParent);
      ....
       
      void ControlMover::Initialise(CWnd* pParent){
          m_pParent = pParent;
       
          if (!m_pParent) return;
          
          CRect rcDialog;
          m_pParent->GetClientRect(rcDialog);
       
          m_lWidth = rcDialog.Width();
          m_lHeight = rcDialog.Height();
      ...


    Все прозрачно, ясно, но... Под ХП все работает ожидаемым образом:

    Прикреплённая картинка
    Прикреплённая картинка


    А под 7й окно распидорашивает в неимоверную ширину:

    Прикреплённая картинка
    Прикреплённая картинка


    Сам я руками размер окна не изменяю, так что единственный вариант - что на этапе OnInitDialog() в m_lWidth заносится какой-то мусор. Спрашивается - почему? Что эдакого семерка делает более чрезпопно, чем ХП?

    Добавлено
    Поставил костыль:

    ExpandedWrap disabled
      void CBlackListManagerDlg::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)
      {
        if(cm.m_lWidth > 100 && cm.m_lWidth < 2000){
          lpMMI->ptMinTrackSize = CPoint(cm.m_lWidth, 300);
        }
          
          CDialog::OnGetMinMaxInfo(lpMMI);
      }


    и теперь тихо офигеваю, т.к. это подействовало. 7ка что, два раза инит диалог вызывает?
      Из того что ты привел ничего не понятно. Код простой все на виду, един. что вижу так это что булет если не указать парент? вроде как члены не будут инициализированы :D
        Все, решен вопрос, семерка OnGetMinMaxInfo первый раз вызывает до OnInitDialog. Поставил защиту в виде проверки, проинициализировано ли все в классе ControlMover. Заодно пофиксил еще кое-то и попрятал что не должно торчать наружу в защищенные методы. Не идеально... Но теперь пашет, как ожидалось.

        Добавлено
        Цитата Cfon @
        Из того что ты привел ничего не понятно. Код простой все на виду, един. что вижу так это что будет если не указать парент? вроде как члены не будут инициализированы


        Ну если на входе передать NULL то конечно ничего вообще работать не будет, ну и печали особой в том не будет, прога то основную функцию выполнять сможет, просто свистелко-перделка "автоподгонка под размер" не будет работать.

        Гораздо веселее когда в таком случае ставят ассерт, и все к чертям вылетает, и попробуй без дебагера найти концы :)
        Сообщение отредактировано: barazuk -
          Результат:

          Прикреплённая картинка
          Прикреплённая картинка
            красиво :D
            я если честно вообще стараюсь не тратить время на интерфейс, ИМХО главное назначение программы ;)

            сначала решаю чтобы программа выполняла свою цель, ну а потом занимаюсь интерфейсом.
            Сообщение отредактировано: Cfon -
              Cfon, на самом деле тут оно нахрен не надо, изначально в другой проге делал, которая для просмотра и редактирования картинок, просто захотел инкапсулировать и выдернуть так чтобы легким движением руки в любой проект потом кидать. Вот теперь сижу и смотрю как допилить, чтобы оба списка масштабировались, и при этом не усложнить все до маразма. В смысле чтобы при растягивании оба списка оставались примерно одной ширины.
              Сообщение отредактировано: barazuk -
                Цитата barazuk @
                Cfon, на самом деле тут оно нахрен не надо, изначально в другой проге делал, которая для просмотра и редактирования картинок, просто захотел инкапсулировать и выдернуть так чтобы легким движением руки в любой проект потом кидать.

                на самом деле все уже придумано и выложено в инет :)
                например вот: https://www.codeproject.com/Articles/116/Layout-Manager-for-Dialogs-Formviews-DialogBars-an
                  Цитата Cfon @
                  на самом деле все уже придумано и выложено в инет


                  Ай вещь на самом деле простецкая настолько, что проще самому с нуля сделать, чем если что разбираться в чужом говнокоде чтобы что-то прикрутить

                  Добавлено
                  Цитата Cfon @
                  например вот:


                  О боже какой адский трындец :)
                    ну хз смотри сам, а я всегда сначала гуглю особенно на codeproject или sourceforge.net :D
                    просто мне так удобнее :P
                      Цитата Cfon @
                      ну хз смотри сам, а я всегда сначала гуглю особенно на codeproject или sourceforge.net


                      Я обычно только подглядываю основную идею... В 99% случаев допиливание и вылов багов в чужом мегакоде на все случаи жизни намного дольше, чем сделать ту маленькую штучку, которую собственно нужно сделать из того парового велосипеда на ядерной тяге, который обычно пафосно городят там где достаточно 20 строк кода :)
                      Сообщение отредактировано: barazuk -
                        вот пример MFC диалога c Layout (упростил макс :D ).
                        вся работа происходит в OnInitDialog. Все что нам нужно добавить в проект файлы ETSLayout.cpp(.h) и поменять базовый класс диалога c CDialogEx на ETSLayoutDialog.
                        VS 2010.
                        Прикреплённый файлПрикреплённый файлTestLayout.zip (95,2 Кбайт, скачиваний: 95)
                        Сообщение отредактировано: Cfon -
                          Цитата Cfon @
                          на самом деле все уже придумано и выложено в инет :)
                          например вот: https://www.codeproject.com/Articles/116/Layout-Manager-for-Dialogs-Formviews-DialogBars-an

                          Получается так, что не всё.
                          Чтобы как-то ограничить размеры окна достаточно обработать сообщение WM_SIZE.
                          Полученные в сообщении размеры сравниваем с ограничениями, и если надо используем "SetWindowPos".
                          Разве этого не достаточно ?
                          Сообщение отредактировано: ЫукпШ -
                            Цитата ЫукпШ @
                            "SetWindowPos".


                            И получаем ill behaved application.

                            Для этого обрабатывается OnGetMinMaxInfo.
                              Цитата ЫукпШ @
                              Чтобы как-то ограничить размеры окна достаточно обработать сообщение WM_SIZE.

                              Вообще, для того, чтоб в диалоге изменять позицию и размер контролов нужно обрабатывать сообщение WM_WINDOWPOSCHANGING
                                Цитата barazuk @
                                Цитата ЫукпШ @
                                "SetWindowPos".


                                И получаем ill behaved application.

                                С чего это вдруг ?
                                Прежде чем советовать, я сам попробовал.
                                Можешь не сомневаться - это устойчиво работает.

                                Добавлено
                                Цитата Олег М @
                                Цитата ЫукпШ @
                                Чтобы как-то ограничить размеры окна достаточно обработать сообщение WM_SIZE.

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

                                Вопрос был о том, "как ограничить размер диалога ?"
                                При изменении размеров окна в оконную процедуру
                                посылается сообщение WM_SIZE с установленными размерами.
                                По этому событию можно сравнить установленные размеры с ограничениями и,
                                если надо, установить допустимые размеры окна.
                                ---
                                Чтобы в диалоге менять что-то, можно использовать любые нужные функции WINAPI.
                                Функции создания "диалога" это оболочка вокруг CreateWindow(Ex).
                                С интерпретатором описания диалогового окна, представленного на языке ресурсов.
                                Это обычные окна (которые все функционально - диалоги), и всё содержимое
                                "диалогов" можно делать исключительно "вручную". Те посредством
                                непосредственного вызова CreateWindow для всех окошек-контролов всех нужных классов.
                                Сообщение отредактировано: ЫукпШ -
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,2001 ]   [ 23 queries used ]   [ Generated: 19.04.24, 16:21 GMT ]