Проблема с BitBlt GDI

#c #winapi #gdi #gdi #ellipse

#c #winapi #gdi #gdi #многоточие

Вопрос:

У меня возникли проблемы с использованием BitBlt в этой программе. Вы изменяете размер окна, и эллипс изменяется вместе с ним. Конечно, при обычном методе hdc он неустойчивый и мерцающий. Я попробовал метод BitBlt, но это тоже не работает (вероятно, потому, что я делаю это неправильно). Может кто-нибудь исправить то, что я делаю неправильно? спасибо

     bool sizing; //global   
case WM_PAINT:
    {
        RECT rect;
        GetClientRect(hwnd, amp;rect);
        hdc = BeginPaint(hwnd, amp;ps);
        mem = CreateCompatibleDC(hdc);
        SelectObject(mem, GetStockObject(HOLLOW_BRUSH));
        if(sizing)
        {
        Ellipse(mem,rect.left, rect.top, rect.right, rect.bottom);
        }
    BitBlt(hdc, rect.left, rect.top, rect.left - rect.right, rect.top -rect.bottom , mem, rect.left, rect.top, SRCCOPY);
        DeleteDC(mem);
        EndPaint(hwnd, amp;ps);
        break;
    }
    case WM_SIZE:
        sizing = true;
        break;
  

Комментарии:

1. Вам придется обработать WM_ERASEBKGND, чтобы избежать мерцания.

Ответ №1:

Похоже, вы пытаетесь нарисовать растровое изображение на основе памяти, а затем вывести его на экран, чтобы избежать мерцания?

Первая проблема здесь связана с мерцанием: сначала вам нужно переопределить WM_ERASEBKGND, как указывает Ханс, — в противном случае Windows сотрет фон с помощью любой оконной кисти (из RegisterClass), и это стирание является обычной причиной мерцания.

Следующая проблема здесь заключается в том, что вы используете «пустой» DC: CreateCompatibleDC выдает вам DC, который является просто контекстом рисования, но контекст содержит растровое изображение размером 1 на 1 пиксель. Для рисования за пределами экрана вам нужны DC и растровое изображение. Найдите время, чтобы прочитать страницу MSDN для CreateCompatible — она вызывает именно эту проблему.

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

Обычный подход здесь таков:

  • Создайте compatibledc для создания DC
  • Createcompatibleb map для создания растрового изображения, на котором вы фактически будете рисовать
  • Выберите объект вашего нового растрового изображения в памяти DC
  • Отрисовка в памяти DC — которая отрисовывает выбранное вами растровое изображение
  • Битблот из памяти DC (т.Е. вашего растрового изображения, которое в нее выделено) в битблот из WM_PAINT
  • Очистка: выделите объект исходного растрового изображения обратно в DC памяти и удалите растровое изображение и DC.