双重缓冲AlphaBlend矩形与文本覆盖
Double-buffering AlphaBlend rect with text overlay
我对如何双缓冲有点困惑。我不确定我是否需要创建另一个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用于在现有图像上绘制具有alpha通道的图像作为覆盖。
相关文章:
- 文本文件中的单词链表
- 如何在 c++ 中覆盖相同的文本文件
- 如何让控制台输出覆盖控制台而不是纯文本输出?
- 在图像上覆盖文本的程序会产生无休止的字符串错误
- 覆盖现有的文本文件C
- 使用fstream在文件中覆盖一些文本,然后删除文件的其余部分
- 在文本文件中覆盖和追加行(C++)
- 尝试在文本文件中添加结构元素而不覆盖它
- 使用c++覆盖文件中的文本
- 如何在OpenGL中覆盖文本
- 是否可以在不覆盖输入中的当前文本的情况下进行 cout
- 如何防止用 ofstream 覆盖文本文件中的信息
- 为QTreeView覆盖QStyledItemDelegate中的文本
- 当文本文件再次打开时,C++会覆盖它
- 双重缓冲AlphaBlend矩形与文本覆盖
- 覆盖写入控制台的文本
- 如何重写/覆盖文本文件中的字符串/行
- 如何输出到控制台,并在不清除屏幕和重写所有内容的情况下覆盖文本
- 如何将字符串添加到现有的文本文件而不覆盖它
- 命令行界面 - C++/CLi - 使用流编写器写入文本文件会覆盖已有的内容