Gdiplus::Graphics 如何擦除某个区域,谢谢

zhangyonghui2117 2015-05-17 05:14:39
如题:
Gdiplus::Graphics obj(GetDc());
现在由于不能用InvalidateRect函数,有没有类似这样的函数ojb.erase(rect(...)),谢谢大家
...全文
440 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaohuh421 2015-05-20
  • 打赏
  • 举报
回复
你就没尝试过, 先在你的内存DC中绘制一个带透明的背景色块吗
「已注销」 2015-05-19
  • 打赏
  • 举报
回复
引用 6 楼 xiaohuh421 的回复:
窗口是透明背景, 这部分是自己处理的, 还是系统处理的. 如果是系统处理的, 那你就可以尝试绘制一块带透明属性的黑色区域来擦除.
你好,现在用的是透明窗口方法,好像比较普遍的处理透明窗口的方法,代码如下:

class LayeredWindowInfo {
	const POINT m_sourcePosition;
	POINT m_windowPosition;
	CSize m_size;
	BLENDFUNCTION m_blend;
	UPDATELAYEREDWINDOWINFO m_info;

public:

	LayeredWindowInfo(
		__in UINT width,
		__in UINT height) :
		m_sourcePosition(),
		m_windowPosition(),
		m_size(width, height),
		m_blend(),
		m_info() {

		m_info.cbSize = sizeof(UPDATELAYEREDWINDOWINFO);
		m_info.pptSrc = &m_sourcePosition;
		m_info.pptDst = &m_windowPosition;
		m_info.psize = &m_size;
		m_info.pblend = &m_blend;
		m_info.dwFlags = ULW_ALPHA;

		m_blend.SourceConstantAlpha = 255;
		m_blend.AlphaFormat = AC_SRC_ALPHA;
	}

	void Update(
		__in HWND window,
		__in HDC source) {

		m_info.hdcSrc = source;

		auto nRet = UpdateLayeredWindowIndirect(window, &m_info);

	}

	UINT GetWidth() const { return m_size.cx; }

	UINT GetHeight() const { return m_size.cy; }
};
通过m_pLayeredInfo->Update(m_hWnd, m_hMemDc);更新画面透明窗口m_hWnd,m_hMemDc是我通过Graphics操作的, Graphics相关如下:

bool CMarkWindow::DrawLine(const CPoint& ptSecond)
{
	if (nullptr != m_hMemDc)
	{
		if (m_pGraphics == NULL)
		{
			m_pGraphics.reset(Gdiplus::Graphics::FromHDC(m_hMemDc));
		}
		if (m_pPen == NULL || m_bBrushReset)
		{
			m_pPen.reset(new Gdiplus::Pen(Gdiplus::Color(m_color), m_LineWidth) );
			m_bBrushReset = false;
		}
		
		m_pGraphics.get()->SetSmoothingMode(Gdiplus::SmoothingMode::SmoothingModeAntiAlias);
		m_pGraphics.get()->DrawLine(m_pPen.get(), m_pt.x, m_pt.y, ptSecond.x, ptSecond.y);
		m_pLayeredInfo->Update(m_hWnd, m_hMemDc);
		
		m_pt = ptSecond;
	}
	return true;
}

「已注销」 2015-05-19
  • 打赏
  • 举报
回复
引用 6 楼 xiaohuh421 的回复:
窗口是透明背景, 这部分是自己处理的, 还是系统处理的. 如果是系统处理的, 那你就可以尝试绘制一块带透明属性的黑色区域来擦除.
是说用(ARGB)0x0000000这种颜色填充吗?谢谢,能帮到就非常感谢呀
xiaohuh421 2015-05-19
  • 打赏
  • 举报
回复
窗口是透明背景, 这部分是自己处理的, 还是系统处理的. 如果是系统处理的, 那你就可以尝试绘制一块带透明属性的黑色区域来擦除.
「已注销」 2015-05-18
  • 打赏
  • 举报
回复
引用 4 楼 xiaohuh421 的回复:
画布的擦除都是以背景色覆盖. 比如背景是白色, 那就是画一个白色区域, 黑色就画黑色.
我的现在是在一个透明窗口上画线(窗口只有画的线是有颜色的,其他部分是透明的),如果用有颜色的去覆盖,就那部分是纯色的了,请问怎么处理好些
xiaohuh421 2015-05-18
  • 打赏
  • 举报
回复
画布的擦除都是以背景色覆盖. 比如背景是白色, 那就是画一个白色区域, 黑色就画黑色.
笨笨仔 2015-05-18
  • 打赏
  • 举报
回复
你想着用函数擦除某个区域,我使用保存的背景按需要覆盖要擦除的区域,可能效果一样吧?而且不管背景是什么图形都可以。
BrillianceRen 2015-05-17
  • 打赏
  • 举报
回复
clear或者各种draw
「已注销」 2015-05-17
  • 打赏
  • 举报
回复
各位,Gdiplus::Graphics 如何擦除某个区域,谢谢

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧