Включение буферизации вывода в windows.h WM_PAINT

РЕДАКТИРОВАТЬ: Я знаю, что это самый медленный способ рисования квадрата, но мне нужно отдельно устанавливать пиксели для отдельной цели.


Я почти уверен, что пытаюсь создать Frame Buffer. У меня есть следующий код:

... /* Other Unrelated (<- I promise) Code */

switch(message)
{
/*  Window is being created*/
case WM_CREATE:
return 0;
break;
/*  Window is closing*/
case WM_CLOSE:
PostQuitMessage(0);
return 0;
break;
/*  Window needs update*/
case WM_PAINT:
hDC = BeginPaint(hwnd,&paintStruct);
/*  Draw a Red Square pixel by pixel*/
for (int x=100;x<300;x++) {
for (int y = 300;y>100;y--) {
SetPixel(hDC, x, y, 0x000000FF);
}
}

EndPaint(hwnd, &paintStruct);
return 0;
break;
default:
break;
}

... /* Other Unrelated (<- I promise) Code*/

Желаемый результат

Красный квадрат, который показывает не каждый нарисованный пиксель, а просто красный квадрат, нарисованный мгновенно. Чтобы разбить его, я хочу, чтобы память заполнилась перед выпуском ее в видеопамять, а не переходя 1 к 1 в видеопамять (надеюсь, здесь используются правильные слова …)


Эта проблема

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


Что я ищу

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

Заранее спасибо. Я думаю, что было бы полезно сказать, что я программирую только на языке C ++ в течение 5 дней, и что любой срыв или прямой ответ будет принят с благодарностью.

-1

Решение

Вам необходимо создать HDC памяти и растровое изображение, выбрать растровое изображение в памяти, нарисовать в памяти, затем BitBlt память постоянного тока до финала HDC, Пример:

case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);

HDC memdc = CreateCompatibleDC(hdc);
HBITMAP bitmap = CreateCompatibleBitmap(hdc, 300, 300);
HBITMAP oldbmp = (HBITMAP)SelectObject(memdc, bitmap);

for(int x = 100; x<300; x++)
for(int y = 300; y>100; y--)
SetPixelV(memdc, x, y, 0x000000FF);
BitBlt(hdc, 0, 0, w, h, memdc, 0, 0, SRCCOPY);

//cleanup:
SelectObject(memdc, oldbmp);
DeleteDC(memdc);
DeleteObject(bitmap);
EndPaint(hWnd, &ps);
return 0;
}

Обратите внимание, что у вас есть доступ ко всем функциям GDI. В этом примере вы можете использовать FillRect вместо:

RECT rc{ 100, 100, 300, 300 };
SetDCBrushColor(memdc, RGB(255, 0, 0));
FillRect(memdc, &rc, (HBRUSH)GetStockObject(DC_BRUSH));

Или использовать GetDIBits манипулировать растровым изображением.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]