怎么让子窗口完全透明

wangjiepro 2012-03-05 06:24:13
程序里有一些特殊的处理,现在想的最简单的一种办法就是创建一个完全透明的子窗口,然后在子窗口上进行操作,让用户以为还是在主窗口上进行,问题是以下两句代码可以使弹出窗口透明,但是不能使子窗口透明:


ModifyStyleEx(0, WS_EX_LAYERED);
SetLayeredWindowAttributes(RGB(255, 0, 255), 0, LWA_ALPHA | LWA_COLORKEY);


如何使子窗口完全透明呢?谢谢!
...全文
674 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
deco1515 2012-12-15
  • 打赏
  • 举报
回复
引用 8 楼 zhanshen2891 的回复:
子窗口不支持layerwindow的alpha,你可以先把子窗口填上某一种颜色,然后让这种颜色透明
已经为子窗口涂上了一种过滤色,主窗口怎么才能让这种颜色透明
axuanjames 2012-06-27
  • 打赏
  • 举报
回复
BOOL CALLBACK CSetupBookMarkDlg::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;
}

int CSetupBookMarkDlg::SetBackTransparent(CWnd *pWnd,BOOL bClientOnly=TRUE)
{
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);
}

dotnet90 2012-03-08
  • 打赏
  • 举报
回复
哪里子窗口copy父窗口背景的例子
zhanshen2891 2012-03-07
  • 打赏
  • 举报
回复
子窗口不支持layerwindow的alpha,你可以先把子窗口填上某一种颜色,然后让这种颜色透明
dahaiI0 2012-03-07
  • 打赏
  • 举报
回复
看能否用POPUP窗口代替子窗口,POPUP透明就简单多了
sj720618 2012-03-07
  • 打赏
  • 举报
回复
做个hook gdi相关的绘图函数 不让窗口被画出来行不?
许文君 2012-03-06
  • 打赏
  • 举报
回复
最简单的方法是拷贝父窗口DC
only_delusion 2012-03-06
  • 打赏
  • 举报
回复
SetLayeredWindowAttribute 不支持子窗口透明。
目前没有方式透明。 系统控件采用gdi绘图 没有Alpha通道,所以没有真正意义上的透明。
stjay的方法确实可以实现一些窗口的透明 例如 richedit等。
但是拖动大小会闪烁 或者 子窗口背景无人绘制等问题。

如果只是想实现看似透明效果的话,可以考虑 子窗口用父窗口背景crop出一部分做自己的背景图或者干脆改用derectui的思路。
  • 打赏
  • 举报
回复
貌似不能为CHILD类型的窗口设置透明
疯狂-的-蜗牛 2012-03-05
  • 打赏
  • 举报
回复
在子窗口的OnInitDialog()中加入以下代码(return TRUE;前)

COLORREF maskColor = RGB(255,255,255);
SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE,GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000);
HINSTANCE hInst=LoadLibrary(_T("User32.DLL"));
if(hInst)
{
typedef BOOL (WINAPI * MYFUNC)(HWND , COLORREF,BYTE,DWORD);
MYFUNC fun=NULL;
fun=(MYFUNC)GetProcAddress(hInst,"SetLayeredWindowAttributes");
if(fun)fun(this->GetSafeHwnd(),maskColor,255,1);
FreeLibrary(hInst);
}
stjay 2012-03-05
  • 打赏
  • 举报
回复
ModifyStyleEx(0, WS_EX_LAYERED | WS_EX_TRANSPARENT);

15,979

社区成员

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

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