c++ - 带文本叠加的双缓冲 AlphaBlend 矩形

标签 c++ c winapi

我对如何双缓冲这个有点困惑。我是 不确定我是否需要创建另一个 CreateCompatibleBitmap 或 CreateCompatibleDC 以及如何链接它们。 这按原样工作,但我不认为它是双缓冲的。

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 用于绘制在现有图像上具有 AlphaChanel 作为叠加层的图像。

关于c++ - 带文本叠加的双缓冲 AlphaBlend 矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33272158/

相关文章:

c - 是否可以强制函数参数在 C 中保持不变?

c - C中pid_t和int的区别

c# - USB HID 卡在 C# 中的 Read() 上

c++ - 系统与 ShellExecute - 差异?

c# - 在 C# 中使用非托管 FindFirstVolume 通过 .NET 枚举卷

c++ - 获取一个Qt项目需要的所有include路径、lib等

c++ - 什么是 undefined reference /未解析的外部符号错误以及如何修复它?

c++ - 在 LuaSQL 代码上断言 C/C++

c++ - 如何在 macOS 上为 Qt 窗口使用 Objective-C 变量和方法?

java - 哪种语言/框架适用于 HPC : Java/.Net/Delphi/C/C++/Objective-C?