C++ GDI双缓冲区黑色闪烁

C++ GDI双缓冲区黑色闪烁,c++,winapi,gdi+,gdi,C++,Winapi,Gdi+,Gdi,我正在使用此BitBlt包装器: 我在main()中初始化它: biop=新位图_操作(); 生物圈->初始化缓冲区(m_hDC,m_hWND,1); 生物圈->创建缓冲区(0); 助手功能: void CreateBuffer() { biop->Create_Buffer(0); } void Render() { biop->Copy_to_Screen(0); } void ClearBuffer() { biop->Free_Buffe

我正在使用此BitBlt包装器:

我在main()中初始化它:

biop=新位图_操作();
生物圈->初始化缓冲区(m_hDC,m_hWND,1);
生物圈->创建缓冲区(0);
助手功能:

void CreateBuffer()
{
    biop->Create_Buffer(0);
}

void Render()
{
    biop->Copy_to_Screen(0);
}

void ClearBuffer()
{
    biop->Free_Buffer(0);
}

void DrawBox(int x, int y, int r, int g, int b, int size, int thickness)
{
    // Brush style to hollow
    m_LogBrush.lbStyle = BS_NULL;

    // Create a logical brush and select into the context
    m_hBrush = CreateBrushIndirect(&m_LogBrush);
    HBRUSH hbrOldBrush = (HBRUSH)SelectObject(biop->Get_DC_Buffer(0), m_hBrush);

    // Create a logical pen and select into the context
    m_hPen = CreatePen(PS_SOLID, thickness, RGB(r, g, b));
    HPEN hpOldPen = (HPEN)SelectObject(biop->Get_DC_Buffer(0), m_hPen);

    // Draw the rectangle
    Rectangle(biop->Get_DC_Buffer(0), (x - size / 2), (y - size / 2), (x + size / 2), (y + size / 2));

    // Remove the object
    SelectObject(biop->Get_DC_Buffer(0), hbrOldBrush);  // first you must restore DC to original state
    SelectObject(biop->Get_DC_Buffer(0), hpOldPen);     // same here
    DeleteObject(m_hBrush);
    DeleteObject(m_hPen);
}
我生成一个线程来渲染数据:

// Inside a thread
while (1)
{
    CreateBuffer();
    for (int i = 0; i < 1028; i++)
    {
        //

        DrawBox()

        //
    }
    Render();
    ClearBuffer();
}
//线程内部
而(1)
{
CreateBuffer();
对于(int i=0;i<1028;i++)
{
//
抽屉()
//
}
Render();
ClearBuffer();
}
我正在使用FindWindow()在另一个应用程序上进行渲染。一切都很好,框被渲染,等等,但有一个疯狂的全屏闪烁,似乎有一个黑色的背景。我猜是在我从内存提取到应用程序的时候

我使用双缓冲来避免闪烁,但它似乎使情况变得更糟。有什么想法吗


谢谢。

如果您需要在现有窗口上绘制透明的东西,我会使用UpdateLayeredWindow API。

如果您尝试在自己的应用程序窗口上绘制,它是否也会闪烁?我想windows可能会有一些问题,你只是不小心画了别人的窗口。从不是窗口所有者的线程操作窗口是不受支持的情况。所有的期望都被打破了,这将不是一个可靠的解决方案。你就是问这个问题的那个人。你为什么要使用一个单独的帐户?你也从来没有回答过我关于你如何、何时、为什么画画或者你想完成什么的问题。请回答这些问题,不要在不知道自己首先在做什么的情况下尝试加倍缓冲。(遗憾的是,有些人更喜欢回答问题而不是解决问题。)是的,同一个人,我使用的是另一台计算机,无法以同一个帐户登录,因此创建了新帐户。我的应用程序加载并初始化缓冲区,使用FindWindow()获取窗口句柄(在我的测试用例中,我使用“Untitled-Notepad”),使用上面的循环创建一个线程,并在该循环中使用x/y坐标在屏幕上绘制64个框,我使用变换移动每个框的坐标。不使用双缓冲,一切正常,但矩形闪烁,当使用双缓冲时,矩形现在是平滑的,不会闪烁太多,但整个窗口闪烁黑色。