在windows.h的WM_PAINT中启用输出缓冲

时间:2018-01-23 21:31:20

标签: c++ windows winapi wm-paint

编辑:我知道这是绘制正方形的最慢方法,但我需要单独设置像素以用于单独的目的。

我很确定我要做的是创建一个帧缓冲区。我有以下代码:

... /* 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到视频内存(我希望我在这里使用正确的词......)

问题

与所需结果相反,我正在设置每个像素时从左侧快速绘制正方形。

我在寻找什么

启用输出缓冲到我的窗口的命令或用于存储像素的函数然后一次性绘制它们,或者任何其他可以获得所需结果的方法。

提前谢谢你。我认为说我只用C ++语言编程5天会很有帮助,任何分解或直接回答都会非常感激。

1 个答案:

答案 0 :(得分: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来操作位图。