На главную Наши проекты:
Журнал   ·   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
  
> Быстрая прорисовка
    Нужно рисровать линии (график) через 50-100 мс. Если просто рисовать
    dc.LineTo(...);
    То все мигает ужасно.
    Как сделать чтоб не мигало? Пробовал Что то типа
    CreateCompatibleDC

    рисую в нем а потом
    BitBlt();
    Так вообще нифига не получилось :(((
      Draw(CDC * pDC)
      {
       CDC memDC;
       if(!memDC.CreateCompatibleDC(pDC))  
         return;

       CBitmap bmp;
       if(!bmp.CreateCompatibleBitmap(pDC, 200, 200) {
         memDC.DeleteDC();
         return;
       }
       
       CBitmap * OldBitmap = memDC.SelectObject(&bmp);

      // не забудь очистить
       CBrush brush;
       brush.CreateSolidBrush(RGB(255, 255, 255)))
       memDC.FillRect(CRect(0, 0, 200, 200), &brush);

      //   memDC теперь рисуй здесь сколько влезет
       memDC.MoveTo(0, 0);
       memCD.LineTo(200,200);

      // теперь копируй на контекс устройства
       bool result = pDC.BitBlt(0, 0, 200, 200, &memDC, 0, 0, SRCCOPY);

       if(!result)
         AfxMessageBox("Ошибка");

       // не забудь удалить
       memDC.SelectObject(OldBitmap);
       memDC.DeleteDC();
       bmp.DeleteBitmap();
      }

      И не забудь переопределить WM_ERASEBKGND: Ты же очистил матрицу !!!
      Быстрее не получиться !
        Все равно мигает :((( Неужто нельзя чтоб не мигало?
        И что за WM_ERASEBKGND? В Dialog-Based приложении (а мне миенно там надо) его не нашел :((
          WM_ERASEBKGND - мессага, которая посылается окну при очищении его содержимого в клиентской области. Т.е. ты сам должен очищать все окно кроме того места, где у тя график :)

          Сам разберешься или помочь?
            Короче говоря по сообщению WM_ERASEBKGRD у тебя очищается окно и в том числе твоя клиентская часть очистка занимает столько же времени что и отрисовка твоего графика следовательно у тебя есть шанс сделать весь процесс в 2 раза быстрее (Я же уже очистил bmp)
              Там не работает bmp.DeleteBitmap();
              И сообщения WM_ERASEBKGND нет в ClassWizard
                Я переопределил WM_ERASEBKGND так. Но теперь не прорисовываются элементы окна (кнопки и т.д.)
                BOOL CFastDrawDlg::OnEraseBkgnd(CDC* pDC)
                {
                     //CDialog::OnEraseBkgnd(pDC);
                     return TRUE;
                }

                А сама OnPaint такая
                void CFastDrawDlg::OnPaint()
                {
                     CPaintDC dc(this);
                     CDC memDC;
                     if(!memDC.CreateCompatibleDC(&dc))  
                           return;

                     CBitmap bmp;
                     if(!bmp.CreateCompatibleBitmap(&dc, 200, 200))
                     {
                           memDC.DeleteDC();
                           return;
                     }
                 
                     CBitmap * OldBitmap = memDC.SelectObject(&bmp);

                     // не забудь очистить
                     CBrush brush;
                     brush.CreateSolidBrush(RGB(255, 255, 255));
                     memDC.FillRect(CRect(0, 0, 200, 200), &brush);

                     Sleep(1000);//Эта строчка показывает, что прорисовка график на экране лишь малое время, а остальное ничего нет :(
                     memDC.Rectangle(0,0,200,200);
                     memDC.MoveTo(0,0);
                     memDC.LineTo(200,200);
                     
                     
                     // теперь копируй на контекс устройства
                     BOOL result = dc.BitBlt(0, 0, 200, 200, &memDC, 0, 0, SRCCOPY);

                     if(!result)
                           AfxMessageBox("Ошибка");

                     // не забудь удалить
                     memDC.SelectObject(OldBitmap);
                     memDC.DeleteDC();
                     DeleteObject(bmp);
                     
                     if (IsIconic())
                     {
                           // device context for painting

                           SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

                           // Center icon in client rectangle
                           int cxIcon = GetSystemMetrics(SM_CXICON);
                           int cyIcon = GetSystemMetrics(SM_CYICON);
                           CRect rect;
                           GetClientRect(&rect);
                           int x = (rect.Width() - cxIcon + 1) / 2;
                           int y = (rect.Height() - cyIcon + 1) / 2;

                           // Draw the icon
                           dc.DrawIcon(x, y, m_hIcon);
                     }
                     else
                     {
                           CDialog::OnPaint();
                     }
                }
                  Пардон пардон ты знаешь я попробовал что-то не очень ускорилось 8-(((

                  Я даже так сделал
                  BOOL CTestDlg::OnEraseBkgnd( CDC* pDC )
                  {
                       CDC memDC;
                   if(!memDC.CreateCompatibleDC(pDC))  
                     return false;

                   CBitmap bmp;
                   if(!bmp.CreateCompatibleBitmap(pDC, 200, 200)) {
                     memDC.DeleteDC();
                     return false;
                   }
                   
                   CBitmap * OldBitmap = memDC.SelectObject(&bmp);


                   CBrush brush;
                   brush.CreateSolidBrush(RGB(255, 255, 255));
                   memDC.FillRect(CRect(0, 0, 200, 200), &brush);


                   memDC.MoveTo(0, 0);
                   memDC.LineTo(200,200);


                   bool result = pDC->BitBlt(0, 0, 200, 200, &memDC, 0, 0, SRCCOPY);

                   if(!result)
                     AfxMessageBox("error");

                   memDC.SelectObject(OldBitmap);
                   memDC.DeleteDC();
                   bmp.DeleteObject();

                   return true;

                  }

                  все равно медленно

                  Могу посоветовать перейти на CFormView ну короче на форме сделать у меня есть такое вроде не тормозит тьфу, тьфу
                  или ищи радивальное решение Вот ..
                    пардон РАДИКАЛЬНОЕ
                      Я переопределил так
                      BOOL CFastDrawDlg::OnEraseBkgnd(CDC* pDC)
                      {
                      return TRUE;
                      }
                      Стало быстро, все круто, но не прорисовываются элементы диалога
                        Вообще лучше не рисуй прямо в диалоге, это глупо. Создай отдельное окно и в нем и рисуй.
                          2Codemaster:
                          Ты меня опередил. >:(

                          2Z@:
                          Делай так! На диалоге создавай статик (Static), там и рисуй график! Можешь, ко всему прочему, еще ловить и мессагу WM_CTLCOLORSTATIC, ... ;)
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


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