На главную Наши проекты:
Журнал   ·   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  все  ( Перейти к последнему сообщению )  
> Мерцание с BitBlt
    Если DrawSquare() пишу в уже существующем моём главном while, но там выполняется много действий, то идёт постоянное мерцание этого квадрата!
    Если делать отдельно, то мерцаний меньше, но они есть. +кушает сильно процц.
    Я не силён в рисовании BitBlt, подскажите как нарисовать квадрат который в моём коде, но что-бы без мерцаний и не сильно кушал проц..

    Код:
    ExpandedWrap disabled
      #include <windows.h>
      using namespace std;
       
      void DrawSquare()
      {
          HWND aHwnd = GetDesktopWindow();
          HDC aHdc = GetDC(aHwnd);
          HDC hcDevice = CreateCompatibleDC(aHdc);
          HBITMAP hcBitmapDevice = CreateCompatibleBitmap(aHdc, 2, 2);
          HGDIOBJ bufBm = (HBITMAP)SelectObject(hcDevice, hcBitmapDevice);
       
          for (int x = 1920 / 2.5; x < 1920 - (1920 / 2.5); x++) for (int y = 1080 / 3.5; y < (1080 / 3.5) + 2; y++) //вверх
          {
              BitBlt(aHdc, x, y, 2, 2, hcDevice, 0, 0, SRCCOPY);
          }
          for (int xx = 1920 / 2.5; xx < 1920 - (1920 / 2.5); xx++) for (int yy = 1080 - (1080 / 2.1); yy < (1080 - (1080 / 2.1)) + 2; yy++) //низ
          {
              BitBlt(aHdc, xx, yy, 2, 2, hcDevice, 0, 0, SRCCOPY);
          }
          for (int xx = 1920 / 2.5; xx < (1920 / 2.5) + 2; xx++) for (int yy = 1080 / 3.5; yy < 1080 - (1080 / 2.1); yy++) //левая сторона
          {
              BitBlt(aHdc, xx, yy, 2, 2, hcDevice, 0, 0, SRCCOPY);
          }
          for (int xx = 1920 - (1920 / 2.5); xx < (1920 - (1920 / 2.5)) + 2; xx++) for (int yy = 1080 / 3.5; yy < 1080 - (1080 / 2.1); yy++) //правая сторона
          {
              BitBlt(aHdc, xx, yy, 2, 2, hcDevice, 0, 0, SRCCOPY);
          }
       
          ReleaseDC(aHwnd, aHdc);
       
          DeleteDC(aHdc);
          DeleteDC(hcDevice);
       
          DeleteObject(hcBitmapDevice);
          DeleteObject(bufBm);
      }
       
      int main()
      {
          while (true)
          {
              DrawSquare();
          }
       
          system("pause");
          return 0;
      }
      Ну очевидно же: нарисовать всё в memDC(в памяти), а потом одним выводом BitBlt'а залупить сие на экран. :yes:
        Цитата Славян @
        Ну очевидно же: нарисовать всё в memDC(в памяти), а потом одним выводом BitBlt'а залупить сие на экран. :yes:

        Это как?
        если так, то нечего не получается:
        ExpandedWrap disabled
          BitBlt([B]hcDevice[/B], x, y, 2, 2, [B]hcDevice[/B], 0, 0, SRCCOPY);
          Цитата Sawella @
          Я не силён в рисовании BitBlt, подскажите как нарисовать квадрат который в моём коде, но что-бы без мерцаний и не сильно кушал проц..

          Сценарий использования BitBlt примерно следующий:
          - Создаёшь контекст, связанный с bitmap (у тебя это сделано, не знаю насколько правильно)
          - Рисуешь в этом контексте то, что тебе нужно. В твоём случае что-то типа LineTo(hcDevice, ......
          - Копируешь содержимое контекста в контекст окна при помощи BitBlt (Один раз!)
            Цитата Sawella @
            Если DrawSquare() пишу в уже существующем моём главном while, но там выполняется много действий, то идёт постоянное мерцание этого квадрата!
            Если делать отдельно, то мерцаний меньше, но они есть. +кушает сильно процц.
            Я не силён в рисовании BitBlt, подскажите как нарисовать квадрат который в моём коде, но что-бы без мерцаний и не сильно кушал проц..

            Код:
            ExpandedWrap disabled
              #include <windows.h>
              using namespace std;
               
              void DrawSquare()
              {
                  HWND aHwnd = GetDesktopWindow();
                  HDC aHdc = GetDC(aHwnd);
                  HDC hcDevice = CreateCompatibleDC(aHdc);
                  HBITMAP hcBitmapDevice = CreateCompatibleBitmap(aHdc, 2, 2);
                  HGDIOBJ bufBm = (HBITMAP)SelectObject(hcDevice, hcBitmapDevice);
               
                  for (int x = 1920 / 2.5; x < 1920 - (1920 / 2.5); x++) for (int y = 1080 / 3.5; y < (1080 / 3.5) + 2; y++) //вверх
                  {
                      BitBlt(aHdc, x, y, 2, 2, hcDevice, 0, 0, SRCCOPY);
                  }
                  for (int xx = 1920 / 2.5; xx < 1920 - (1920 / 2.5); xx++) for (int yy = 1080 - (1080 / 2.1); yy < (1080 - (1080 / 2.1)) + 2; yy++) //низ
                  {
                      BitBlt(aHdc, xx, yy, 2, 2, hcDevice, 0, 0, SRCCOPY);
                  }
                  for (int xx = 1920 / 2.5; xx < (1920 / 2.5) + 2; xx++) for (int yy = 1080 / 3.5; yy < 1080 - (1080 / 2.1); yy++) //левая сторона
                  {
                      BitBlt(aHdc, xx, yy, 2, 2, hcDevice, 0, 0, SRCCOPY);
                  }
                  for (int xx = 1920 - (1920 / 2.5); xx < (1920 - (1920 / 2.5)) + 2; xx++) for (int yy = 1080 / 3.5; yy < 1080 - (1080 / 2.1); yy++) //правая сторона
                  {
                      BitBlt(aHdc, xx, yy, 2, 2, hcDevice, 0, 0, SRCCOPY);
                  }
               
                  ReleaseDC(aHwnd, aHdc);
               
                  DeleteDC(aHdc);
                  DeleteDC(hcDevice);
               
                  DeleteObject(hcBitmapDevice);
                  DeleteObject(bufBm);
              }
               
              int main()
              {
                  while (true)
                  {
                      DrawSquare();
                  }
               
                  system("pause");
                  return 0;
              }

            Дак у тя вызов draw крутиться в бесконечном цикле :D
              Цитата Sawella @
              но что-бы без мерцаний и не сильно кушал проц..

              Попробуй так:

              ExpandedWrap disabled
                    #include <windows.h>
                    using namespace std;
                    
                    HWND aHwnd  = NULL;
                    HDC aHdc    = NULL;
                    HDC hcDevice = NULL;
                    HBITMAP hcBitmapDevice =NULL;
                    HGDIOBJ bufBm  = NULL;
                    HBRUSH brush   = NULL;
                    COLORREF color = RGB(0,0,255);
                 
                    int x      = 0;
                    int y      = 0;
                    int dxdc   = 500;
                    int dydc   = 300;
                    int deltay = 4;
                    int deltax = 4;
                 
                    void DrawSquare()
                    {
                     BitBlt(aHdc, x, y, dxdc, deltay, hcDevice, 0, 0, SRCCOPY);
                     BitBlt(aHdc, x, y, deltax, dydc, hcDevice, 0, 0, SRCCOPY);
                     BitBlt(aHdc, x, y+dydc-deltay, dxdc, deltay, hcDevice, 0, 0, SRCCOPY);
                     BitBlt(aHdc, x+dxdc-deltax, y, deltax, dydc, hcDevice, 0, 0, SRCCOPY);
                    }
                 
                 
                 
                    int main()
                    {
                 
                    aHwnd          = ::GetDesktopWindow();
                    RECT rc;       ::GetWindowRect (aHwnd, &rc);
                 
                    x = ((rc.right  - rc.left) - dxdc)/2;
                    y = ((rc.bottom - rc.top)  - dydc)/2;
                 
                 
                    aHdc           = ::GetDC(aHwnd);
                    hcDevice       = ::CreateCompatibleDC(aHdc);
                 
                    hcBitmapDevice = ::CreateCompatibleBitmap(aHdc, dxdc, dydc);
                    bufBm          = (HBITMAP)::SelectObject(hcDevice, hcBitmapDevice);
                 
                    brush          = ::CreateSolidBrush       (color);
                                     ::SelectObject           (hcDevice, brush);
                 
                                     ::PatBlt(hcDevice,0,0,dxdc,dydc,PATCOPY); // закрасить hcDevice кистью brush
                 
                 
                 
                //        while (true)
                    for(int i=0;i<1000;++i)
                    {
                     DrawSquare();
                     ::Sleep(10);
                    }
                 
                    ReleaseDC(aHwnd, aHdc);
                    
                    DeleteDC(aHdc);
                    DeleteDC(hcDevice);
                    
                    DeleteObject(hcBitmapDevice);
                    DeleteObject(bufBm);
                    DeleteObject(brush);
                 
                    }
                Не очень понятно, как это может избавить от мерцания. Не проще ли просто нарисовать четыре линии?
                  Цитата ЫукпШ @
                  Попробуй так:

                  Спасибо, за пример, но мерцания всё равно есть.
                    Цитата Sawella @
                    Цитата ЫукпШ @
                    Попробуй так:

                    Спасибо, за пример, но мерцания всё равно есть.

                    А у меня - нет.

                    Добавлено
                    Цитата Олег М @
                    Не очень понятно, как это может избавить от мерцания. Не проще ли просто нарисовать четыре линии?

                    автор хотел с BitBlt. Это более общий случай - возможно, имеются и дальнейшие планы.
                      Цитата ЫукпШ @
                      А у меня - нет.

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

                      p.s и если я draw пишу в свой главный while то мерцает постоянно, и почему вы решили делать с for? ведь после числа 1000 и.т.д. оно прекратится.
                      Сообщение отредактировано: Sawella -
                        Цитата Sawella @
                        Спасибо, за пример, но мерцания всё равно есть

                        Чтобы не было мерцаний bitblt должен быть один. А там – четыре!
                        Кроме того у окна должны быть установлены определенные флаги, чтоб оно не стирало содержимое при перерисовке.
                          Цитата Sawella @
                          Цитата ЫукпШ @
                          А у меня - нет.

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

                          С трудом понимаю, что ты хочешь сделать.
                          В примере производится рисование в окне деск-топа.
                          Это "типа фокус", так обычные приложения не работают и смысла
                          делать такие вещи просто нет.

                          Добавлено
                          Цитата Олег М @
                          Цитата Sawella @
                          Спасибо, за пример, но мерцания всё равно есть

                          Чтобы не было мерцаний bitblt должен быть один. А там – четыре!

                          А почему 1 - можно, а 4 нельзя ?
                          Что за бред... :o
                            Цитата ЫукпШ @
                            А почему 1 - можно, а 4 нельзя ?
                            Что за бред...

                            Потому что в том и смысл, чтобы вывести все изображение за один раз
                              Цитата Олег М @
                              Цитата ЫукпШ @
                              А почему 1 - можно, а 4 нельзя ?
                              Что за бред...

                              Потому что в том и смысл, чтобы вывести все изображение за один раз

                              Специального смысла такого нет.
                              Этот "смысл" зависит от конкретных потребностей и логики конкретного приложения.
                              Прямого отношения к видео-эффектам это не имеет.
                              Мелькания будут заметны, если перерисовка будет занимать более ~20.8 [мс] (48 гц).
                              ---
                              Поэтому я резко уменьшил число BitBlt в циклах алгоритма автора.
                              Для рисования отрезка прямой нет необходимости выводить отрезок
                              малыми фрагментами (как сделал автор) - можно вывести весь отрезок целиком.
                              Гарантий не было, но интуиция подсказывала, где проблема.
                              Сообщение отредактировано: ЫукпШ -
                                Цитата ЫукпШ @

                                Специального смысла такого нет.
                                Этот "смысл" зависит от конкретных потребностей и логики конкретного приложения.
                                Прямого отношения к видео-эффектам это не имеет.
                                Мелькания будут заметны, если перерисовка будет занимать более 48 [мс].


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


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0683 ]   [ 16 queries used ]   [ Generated: 9.05.24, 00:47 GMT ]