#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.