На главную Наши проекты:
Журнал   ·   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
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> скрол проблема кнопка нету , нет скрола нет проблем
    Всем привет!

    создаю внизу виртуального окна со скролом кнопку, все чикибамбони :D, прокручиваю кнопка есть, НО вот если окно обновляется (например по CDocument::OnNewDocument) когда мы находимся внизу окна, ну или где-то между, то все кнопка исчезает, как Алладин :D
    Все работает пока окно находится в не прокрученом состоянии вооот такие дела, че делать?
    ExpandedWrap disabled
      void CExample4View::OnInitialUpdate()
      {
          //TRACE("CExample4View::OnInitialUpdate\n");
       
          CScrollView::OnInitialUpdate();
       
       
          const int cMapMode = MM_HIMETRIC;
       
          // устанавливаем размеры окна 20 Х 40 см
          const int cX = 20000;
          const int cY = 40000;
       
          CSize sizeTotal(cX, cY);
          CSize sizePage(sizeTotal.cx / 2, sizeTotal.cy / 2);
          CSize sizeLine(sizeTotal.cx / 50, sizeTotal.cy / 50);
       
          SetScrollSizes(cMapMode, sizeTotal, sizePage, sizeLine);
       
       
          // Располагаем кнопку во вьшке
          CClientDC dc(this);
          dc.SetMapMode(cMapMode);    
          
          CPoint pt(0, -cY + 1000);
          dc.LPtoDP(&pt);
       
          mFirstPageButton.SetWindowPos(&wndTop, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
      }


    сама кнопка создается в OnCreate
    ExpandedWrap disabled
      int CExample4View::OnCreate(LPCREATESTRUCT lpCreateStruct)
      {
          if (CScrollView::OnCreate(lpCreateStruct) == -1)
              return -1;
       
          // создаем кнопку
          mFirstPageButton.Create(_T("First"), BS_PUSHBUTTON, CRect(0,0,76,23), this, ID_FIRST_BUTTON);
       
          return 0;
      }
      Цитата Cfon @
      создаю внизу виртуального окна со скролом кнопку, все чикибамбони , прокручиваю кнопка есть, НО вот если окно обновляется (например по CDocument::OnNewDocument) когда мы находимся внизу окна, ну или где-то между, то все кнопка исчезает, как Алладин
      Все работает пока окно находится в не прокрученом состоянии вооот такие дела, че делать?

      А ты что хочешь сделать-то? Чтоб у тебя кнопка всегда висела в левом нижнем углу окна?

      Добавлено
      И, возможно, тебе для CExample4View нужно установить флажки WS_CLIPCHILDREN и WS_CLIPSIBLINGS, где-нибудь в PreCreateWindow
      Сообщение отредактировано: Олег М -
        Цитата Олег М @
        Цитата Cfon @
        создаю внизу виртуального окна со скролом кнопку, все чикибамбони , прокручиваю кнопка есть, НО вот если окно обновляется (например по CDocument::OnNewDocument) когда мы находимся внизу окна, ну или где-то между, то все кнопка исчезает, как Алладин
        Все работает пока окно находится в не прокрученом состоянии вооот такие дела, че делать?

        А ты что хочешь сделать-то? Чтоб у тебя кнопка всегда висела в левом нижнем углу окна?

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



        Цитата Олег М @
        И, возможно, тебе для CExample4View нужно установить флажки WS_CLIPCHILDREN и WS_CLIPSIBLINGS, где-нибудь в PreCreateWindow

        для чего?
        Сообщение отредактировано: Cfon -
          Цитата Cfon @
          И, возможно, тебе для CExample4View нужно установить флажки WS_CLIPCHILDREN и WS_CLIPSIBLINGS, где-нибудь в PreCreateWindow

          для чего?

          Чтоб дочерние окна не перерисовывались по отрисовке родителя

          Добавлено
          Цитата Cfon @
          они будут снизу под таблицей, фиксировать их положение нельзя так как число записей меняется.
          можно конечно вверху, но хотелось бы снизу

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

            Тогда тебе надо будет их перемещать, по WM_WINDOWPOSCHANGING

            ща проверю
              блин сори чето не въеду как по WM_WINDOWPOSCHANGING сделать :(
              если не сложно можно примерчик, вот мой пример в действии
              Прикреплённый файлПрикреплённый файлExample4.zip (77,26 Кбайт, скачиваний: 88)

              Добавлено
              как вариант мне подойдет прокрутка окна наверх, но как это сделать программно?! :huh:
                Цитата Cfon @
                блин сори чето не въеду как по WM_WINDOWPOSCHANGING сделать
                если не сложно можно примерчик, вот мой пример в действии


                В обработчике CExample4View::OnWindowPosChanging вызывай SetWindowPos для кнопки с новыми координатами и флагами SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW
                  Цитата Олег М @
                  В обработчике CExample4View::OnWindowPosChanging вызывай SetWindowPos для кнопки с новыми координатами и флагами SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOREDRAW

                  ты сам то сделаешь? :D

                  без обид :D
                  Сообщение отредактировано: Cfon -
                    Цитата Cfon @
                    ты сам то сделаешь?

                    В смысле?
                      Цитата Олег М @
                      Цитата Cfon @
                      ты сам то сделаешь?

                      В смысле?

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

                      если уж никак нельзя, то есть вариант (он даже правильнее) юзать тулбар и на нем разместить эти кнопки
                      скорее всего я так сделаю, но мне хочеться ради интереса сделать по другому :)
                      Сообщение отредактировано: Cfon -
                        Как вариант, чтоб не заморачиваться со скроллингом (я тупо не помню, как он работет), можно сделать эти кнопки принадлежащими тому же окну, которому принадлежит View. Просто поместить их выше по z-order

                        Добавлено
                        При создании указать mFirstPageButton.Create(_T("First"), BS_PUSHBUTTON, CRect(0,0,76,23), GetParent(), ID_FIRST_BUTTON);

                        Добавлено
                        А здесь mFirstPageButton.SetWindowPos(this, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
                          Цитата Олег М @
                          Как вариант, чтоб не заморачиваться со скроллингом (я тупо не помню, как он работет), можно сделать эти кнопки принадлежащими тому же окну, которому принадлежит View. Просто поместить их выше по z-order

                          Добавлено
                          При создании указать mFirstPageButton.Create(_T("First"), BS_PUSHBUTTON, CRect(0,0,76,23), GetParent(), ID_FIRST_BUTTON);

                          Добавлено
                          А здесь mFirstPageButton.SetWindowPos(this, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);

                          нет все не то, видимо ты давно не юзал MFC :)

                          решение в CScrollView::GetScrollPosition
                          ExpandedWrap disabled
                            void CExample4View::OnInitialUpdate()
                            {
                                TRACE("CExample4View::OnInitialUpdate\n");
                             
                                CScrollView::OnInitialUpdate();
                             
                                //CSize sizeTotal;
                                //// TODO: calculate the total size of this view
                                //sizeTotal.cx = sizeTotal.cy = 100;
                                //SetScrollSizes(MM_TEXT, sizeTotal);
                             
                                const int cMapMode = MM_HIMETRIC;
                             
                                // устанавливаем размеры окна 20 Х 40 см
                                const int cX = 20000;
                                const int cY = 40000;
                             
                                CSize sizeTotal(cX, cY);
                                CSize sizePage(sizeTotal.cx / 2, sizeTotal.cy / 2);
                                CSize sizeLine(sizeTotal.cx / 50, sizeTotal.cy / 50);
                             
                                SetScrollSizes(cMapMode, sizeTotal, sizePage, sizeLine);
                             
                                CPoint scrlPos = GetScrollPosition();  //<--- вот ана спасение :D
                                TRACE("(%d, %d\n)", scrlPos.x, scrlPos.y);
                             
                                // Располагаем кнопку во вьшке
                                CClientDC dc(this);
                                dc.SetMapMode(cMapMode);    
                                
                                CPoint pt(0, -cY - scrlPos.y + 1000); //<--- здесь коррекция положения
                                dc.LPtoDP(&pt);
                             
                                mFirstPageButton.SetWindowPos(&wndTop, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW);
                            }
                          Сообщение отредактировано: Cfon -
                            Цитата Cfon @
                            нет все не то, видимо ты давно не юзал MFC

                            Что именно не то? Чего я не знаю в MFC, что знаешь ты?


                            Цитата Cfon @
                                // Располагаем кнопку во вьшке
                                CClientDC dc(this);
                                dc.SetMapMode(cMapMode);    
                             
                                CPoint pt(0, -cY - scrlPos.y + 1000); //<--- здесь коррекция положения
                                dc.LPtoDP(&pt);
                             


                            Зачем тебе здесь CDC, ты что-то рисовать собрался?
                            Чтобы определить координаты левого-нижнего угла, достаточно вызвать GetClientRect
                              Цитата Олег М @
                              Зачем тебе здесь CDC, ты что-то рисовать собрался?
                              Чтобы определить координаты левого-нижнего угла, достаточно вызвать GetClientRect

                              CDC здесь чтобы установить режим преобразования mm_himetric и перевести из логических координат в координаты устройства

                              Добавлено
                              ты немного смотри код то :D
                              Сообщение отредактировано: Cfon -
                                Цитата Cfon @
                                CDC здесь чтобы установить режим преобразования mm_himetric и перевести из логических координат в координаты устройства

                                Зачем для SetWindowPos himetric? Сравни полученную координату c GetClientRect, думаю, будет то же самое значение
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0459 ]   [ 19 queries used ]   [ Generated: 29.03.24, 15:15 GMT ]