Проблема BitBlt GDI - PullRequest
       35

Проблема BitBlt GDI

0 голосов
/ 27 мая 2011

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

    bool sizing; //global   
case WM_PAINT:
    {
        RECT rect;
        GetClientRect(hwnd, &rect);
        hdc = BeginPaint(hwnd, &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, &ps);
        break;
    }
    case WM_SIZE:
        sizing = true;
        break;

1 Ответ

6 голосов
/ 27 мая 2011

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

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

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

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

Обычный подход здесь:

  • CreateCompatibleDC для создания DC
  • CreateCompatibleBitmap для создания растрового изображения, которое вы фактически нарисуете в
  • SelectObject вашего нового растрового изображения в памяти DC
  • Draw в память DC - который рисует на выбранном вами растровом изображении
  • BitBlt из памяти DC (т. Е. Из вашего растрового изображения, которое выделено в него) в WM_PAINT
  • Очистка: выберите «Извлечь исходное растровое изображение обратно в память DC и удалить растровое изображение и DC.
...