VC实现对话框客户区透明

这2个函数很是神奇,能让窗口客户区透明,真正的透明,像被美工刀抠掉一样,可以穿过窗口点击后面的图标或者按钮。


int SetBackTransparent(CWnd* pWnd, BOOL bClientOnly)
{
	CRgn rgn;
	if (bClientOnly)
	{
		CRgn rgnWindow, rgnClient;
		CRect rcWindow, rcClient, rcRgn;
		pWnd->GetWindowRect(rcWindow);
		pWnd->GetClientRect(rcClient);
		pWnd->ClientToScreen(rcClient);
		rgnWindow.CreateRectRgn(rcWindow.left, rcWindow.top,
			rcWindow.right, rcWindow.bottom);
		rgnClient.CreateRectRgn(rcClient.left, rcClient.top,
			rcClient.right, rcClient.bottom);
		rgn.CreateRectRgn(0, 0, 1, 1);
		rgn.CombineRgn(&rgnWindow, &rgnClient, RGN_DIFF);
	}
	else {
		rgn.CreateRectRgn(0, 0, 0, 0);
	}
	::EnumChildWindows(pWnd->GetSafeHwnd(), (WNDENUMPROC)EnumChildFunc, (LPARAM)&rgn);
	return pWnd->SetWindowRgn(rgn, TRUE);
}

BOOL CALLBACK EnumChildFunc(HWND hwnd, LPARAM lParam)
{
	CRgn* pRgn = (CRgn*)lParam;
	CRect rcChild;
	::GetWindowRect(hwnd, rcChild);
	CRgn rgnChild;
	CRgn rgnCopy;
	rgnCopy.CreateRectRgn(0, 0, 1, 1);
	rgnCopy.CopyRgn(pRgn);
	rgnChild.CreateRectRgn(rcChild.left, rcChild.top,
		rcChild.right, rcChild.bottom);
	pRgn->CombineRgn(&rgnCopy, &rgnChild, RGN_OR);
	return TRUE;
}


调用办法:


  在CYourDialog::OnInitDialog 里加上    //也就是MFC的×××::OnInitDialog函数(×××代表具体的工程名)
  SetBackTransparent(this);
  如果要连非客户区都透明,用
  SetBackTransparent(this,  FALSE);

以上两个函数一定要写在OnInitDialog()之前,不然会报错;这两个函数在MFC的默认包含文件里已经声明过了,调用前无需再声明,此处应该只是重写了这两个函数。

示例代码:https://pan.baidu.com/s/1qYbP77A

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值