带有文本覆盖的双缓冲 AlphaBlend rect

Posted

技术标签:

【中文标题】带有文本覆盖的双缓冲 AlphaBlend rect【英文标题】:Double-buffering AlphaBlend rect with text overlay 【发布时间】:2015-10-22 01:49:53 【问题描述】:

我对如何双缓冲这个有点困惑。我是 不确定我是否需要创建另一个 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 有关系,它保留了第一次绘制时窗口下的东西,因为它在我之前就已经工作了使用那个

【问题讨论】:

通常你需要AlphaBlend来绘制半透明的位图图像。但是你没有任何图像,你只是写信给hdc。您是否仅针对双缓冲?还是与位图图像有关? HDC hDCMem = CreateCompatibleDC(_hdc); 这应该是 hdc 而不是 _hdc 哦,我错过了,我试图在我完全透明的窗口上绘制一个半透明的矩形 hBitmapMem 是单色位图。请参阅CreateCompatibleBitmap 的备注部分:“当创建内存设备上下文时,它最初会选择一个 1×1 单色位图。如果在 CreateCompatibleBitmap 中使用此内存设备上下文,创建的位图是单色位图。要创建彩色位图,请使用用于创建内存设备上下文的 HDC [...]"跨度> 【参考方案1】:

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

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

您使用 AlphaBlend 的方式是错误的。 AlphaBlend 用于在现有图像上绘制具有 AlphaChanel 的图像作为叠加层。

【讨论】:

我正在使用 alphaBlend 使我的矩形透明,因为我不知道任何其他方法可以做到这一点,有什么方法可以给我看一个例子或链接我吗? @ramafe 您使用 AlphaBlend 的方式没有问题;不过,我认为这与您关于双缓冲的问题没有任何关系。

以上是关于带有文本覆盖的双缓冲 AlphaBlend rect的主要内容,如果未能解决你的问题,请参考以下文章

winform的双缓冲

applet 中的双缓冲是如何工作的?

InnoDB的双写缓冲

基于c#的双缓冲技术画图

消费者生产者模型中的双缓冲 OpenGL 对象

暂时禁用Java图形小程序中的双缓冲