双重缓冲AlphaBlend矩形与文本覆盖

Double-buffering AlphaBlend rect with text overlay

本文关键字:文本 覆盖 缓冲 AlphaBlend      更新时间:2023-10-16

我对如何双缓冲有点困惑。我不确定我是否需要创建另一个CreateCompatibleBitmapCreateCompatibleDC以及如何连接它们。这可以正常工作,但我不认为它的双缓冲是正确的。

void __OnPaint(HWND hWnd, HDC _hdc = nullptr)
{
    HDC hdc = _hdc;
    PAINTSTRUCT paint;
    RECT& rcClient = paint.rcPaint;
    if (!_hdc)
        hdc = BeginPaint(hWnd, &paint);
    else
        GetClientRect(hWnd, &rcClient);
    if (hdc)
    {
        int width = rcClient.right - rcClient.left;
        int height = rcClient.bottom - rcClient.top;
        HDC hDCMem = CreateCompatibleDC(_hdc);
        HBITMAP hBitmapMem = CreateCompatibleBitmap(hDCMem, width, height);
        SelectObject(hDCMem, hBitmapMem);
        Rectangle(hDCMem, 0, 0, width, height);
        BLENDFUNCTION bfn;
        bfn.BlendOp = AC_SRC_OVER;
        bfn.BlendFlags = 0;
        bfn.AlphaFormat = 0;
        bfn.SourceConstantAlpha = 0x50;
        AlphaBlend(hdc, 0, 0, width, height, hDCMem, 0, 0, width, height, bfn);
        SetTextColor(hdc, RGB(255, 0, 0));
        SetBkMode(hdc, TRANSPARENT);
        DrawText(hdc, "Your text here", -1, &rcClient, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
        //BitBlt(hdc, 0, 0, width, height, hDCMem, 0, 0, SRCCOPY);
        DeleteDC(hDCMem);
        DeleteObject(hBitmapMem);
    }
    if (!_hdc)
        EndPaint(hWnd, &paint);
}

我还发现我有另一个问题。我在WM_TIMER中移动我的窗口,我调用我的__onpaint,我遇到的问题是它不重新绘制它与alphaBlend有关,它保留了在第一次绘制时在窗口下的东西,因为它在我使用

之前工作过

双缓冲是在一个临时的位图上完成所有的打印和绘图,应该存储在某个地方。位图上的绘图可以发生在WM_PAINT事件之外(例如:添加项目或选择更改)。

然后在WM_PAINT事件上,你唯一要做的就是通过BitBlt函数或类似的函数将该位图投影到窗口。

你使用AlphaBlend的方式是错误的。AlphaBlend用于在现有图像上绘制具有alpha通道的图像作为覆盖。