C语言API如何让窗口里的部分背景透明?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言API如何让窗口里的部分背景透明?相关的知识,希望对你有一定的参考价值。
比如窗口的一个矩形让它透明掉可以看到桌面,其他不透明,还有就是怎么把窗口的边框透明掉?
先把需要透明的地方填充成某一颜色,然后用SetLayeredWindowAttributes函数指定要透明的颜色,这一块区域就被透明了如果要边框透明掉,只需要把窗口的边框和标题栏去掉就可以了.追问
怎么去掉边框?我在CreateWindow里去掉了Border样式,可是那边框还是有,还有就是,SetLayeredWindowAttributes会不会把所有的指定的颜色都透明掉?比如我指定红色,那窗口里面的所有红色都透明了?
追答//创建一个带有 WS_EX_LAYERED 扩展样式的,无标题栏,无框的窗口
hWnd = CreateWindowEx(WS_EX_LAYERED, szWindowClass, szTitle, WS_POPUP,
CW_USEDEFAULT, CW_USEDEFAULT, 600, 400, NULL, NULL, hInstance, NULL);
你可以指定一种不常用的颜色,比如品红色 RGB(0xff, 0, 0xff)
如果你窗口内的颜色不是太丰富的话可以用这种方法
写了一个例子,可以参考一下,有什么不懂的可以追问.
嗯嗯,厉害!我想再问一个,就是用GetSystemMetrics函数来获取边框的宽度是1,怎么在程序里面显示的边框却不是1px的?该怎么得到左右边框具体的宽度和上下边框具体的高度?
追答获取边框宽度可以用
SM_CYSIZEFRAME
SM_CXSIZEFRAME
SM_CYFRAME
SM_CXFRAME
不知道你用的是哪一个
这几个的值都是一样的
用的是SM_CXBORDER
追答SM_CXBORDER 这个代表3D样式边的宽度
参考技术A 用路径层切割,切割掉的部分不会显示,但还是存在的,也就是鼠标可以点到,如果不想点到,还要另加程序,这我也不太会,都是GUI里的API用去来很麻烦。。。。追问能告诉我切割的具体函数吗
参考技术B 用背景色画一个大方块。方块原点 0,0,长等于窗宽,高等于窗高。API 函数
int FillRect(HDC hDC, CONST RECT *lprc, HBRUSH hbr);
试一下追问
那那个画刷用什么画刷?
追答NULL_BRUAH你查一下MSDN
追问这个我用过啊,矩形是透明,但窗口是白色底的,窗口这一部分依旧没有变透明啊
追答调节窗体透明度可以先使用SetWindowLong为窗体加上WS_EX_LAYERED属性,再使用来SetLayeredWindowAttributes指定窗体的透明度。这样就可以在程序运行时动态的调节窗体的透明度了。
下面先介绍下SetWindowLong和SetLayeredWindowAttributes函数。
SetWindowLong可以用来设置窗口的一些属性,其函数原型如下:
LONGSetWindowLong(
HWNDhWnd,
int nIndex,
LONGdwNewLong
);
第一个参数表示窗口句柄。
第二个参数代表要设置的哪一种值,如GWL_STYLE表示将设置窗口的风格,这个参数还可以取GWL_EXSTYLE,GWL_WNDPROC,DWL_DLGPROC,GWL_HINSTANCE,GWL_USERDATA等等。
第三个参数表示要设置的值。
比如要设置对话框也能够可调节窗口大小,可以用:
// 设置对话框大小可调节
SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);
如何将控件设置为透明背景
【中文标题】如何将控件设置为透明背景【英文标题】:How to set a control to a transparent background 【发布时间】:2014-01-25 09:25:06 【问题描述】:如何将控件的背景设置为透明?
我现在说的是Label
和Text
控件,但可以是我在GUI 中看到的任何标准控件。
【问题讨论】:
为什么需要它们是透明的? Visual Studio 默认使标签透明,就像我工作的其他环境一样。答案是我不想设置背景颜色。我想让窗口的背景(应用程序背景)显示出来。 【参考方案1】:如果您添加一个 Composite 并指定以下标志,它将是透明的:new Composite(shell, SWT.TRANSPARENT | SWT.NO_BACKGROUND);
【讨论】:
【参考方案2】:据我所知,您不能在 SWT 中设置透明或半透明的控件(某些操作系统上的 shell 除外),例如在表格控件前面显示一个面板,表格将通过面板显示。正如其他海报所写,一个人只能继承背景。
【讨论】:
【参考方案3】:shell.setBackgroundMode(SWT.INHERIT_FORCE);
会做你想做的。
Composite
常量表示一个属性(例如背景)被所有子级继承。
public static void main(String[] args)
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout(1, false));
shell.setText("***");
shell.setBackground(display.getSystemColor(SWT.COLOR_BLUE));
shell.setBackgroundMode(SWT.INHERIT_FORCE);
new Button(shell, SWT.PUSH).setText("Button");
new Label(shell, SWT.NONE).setText("Label");
shell.pack();
shell.open();
while (!shell.isDisposed())
if (!display.readAndDispatch())
display.sleep();
display.dispose();
看起来像这样:
【讨论】:
不错的答案。我只需要添加这一行:shell.setBackgroundMode(SWT.INHERIT_FORCE);在我设置背景之后。【参考方案4】:您需要在子控件之前对您的组合进行以下调用,例如标签将从组合中继承背景。
composite.setBackgroundMode( SWT.INHERIT_DEFAULT );
【讨论】:
我添加了这行代码以及其他代码来创建复合变量(请参阅我的更新),但我仍然没有看到标签是透明的。以上是关于C语言API如何让窗口里的部分背景透明?的主要内容,如果未能解决你的问题,请参考以下文章
可以使用Xcode12的.command时如何让MacApp窗口背景透明或半透明