Я пытаюсь объединить текстуры Blit с рисунком GDI поверх него
(от
void draw()
{
StretchDIBits(hdc, 0, 0, CLIENT_X, CLIENT_Y, 0, 0, BUF_X, BUF_Y, buffer, &bmi, DIB_RGB_COLORS, SRCCOPY);
TextOut(hdc, 10, 10, "Hello World", 11);
}
GetDC один раз установил hdc во время установки, но это, вероятно, нормально; это выше, я запускаю как в режиме ожидания 100 раз в секунду, а также сообщение fron OnPain; и это не работает хорошо, потому что результат TextOut просто мигает, остальное все в порядке — кто-нибудь может дать мне несколько советов, как убрать это мигание и получить стабильный результат TextOut? много тнкс
Вам нужен «двойной буфер», чтобы избежать мигания.
Создать память DC CreateCompatibleDC
выберите в нем растровое изображение с правильным размером, созданным с CreateCompatibleBitmap
и краски в этой памяти ДК.
Когда ваша фотография готова — BitBlt
это у тебя на окне ОК.
Это естественно. Вы рисуете DIB на DC. И сразу же вы рисуете текст, который (предположительно) размещен так, что его ограничивающий прямоугольник перекрывается с тем, который используется в StretchDIBits
,
Простыми словами: вы рисуете что-то, а затем вы рисуете что-то еще в том же месте. Это будет мигать. Что еще ты ожидал?
Во избежание мигания следует использовать так называемую двойную буферизацию. Это означает:
BitBlt
перенести изображение из растрового изображения на ваш начальный DC.DeleteObject
для DIB, DeleteDC
для памяти DC.При желании вы можете сохранить свое растровое изображение вместо того, чтобы создавать его каждый раз, когда вам нужно что-то нарисовать. Это лучше с точки зрения производительности: делать StretchXXXX
плюс, рисование на экране из растрового изображения намного быстрее, чем рисование DIB (при условии, что видеокарта поддерживает 2D-ускорение).