Qt 使用win32的setwindowlong 将透明窗口B 附着在窗口A上
时间: 2023-12-03 13:47:09 浏览: 58
在使用 Qt 中将窗口 B 附着在窗口 A 上,可以使用 QWidget::winId() 函数获取窗口 A 的句柄,然后使用 win32 的 SetWindowLongPtr 函数来设置窗口 B 的透明属性:
```
HWND hWndA = (HWND)widgetA->winId();
HWND hWndB = (HWND)widgetB->winId();
LONG_PTR style = GetWindowLongPtr(hWndB, GWL_STYLE);
style &= ~WS_POPUP; // 移除弹出式窗口样式
style |= WS_CHILD; // 添加子窗口样式
SetWindowLongPtr(hWndB, GWL_STYLE, style);
LONG_PTR exStyle = GetWindowLongPtr(hWndB, GWL_EXSTYLE);
exStyle |= WS_EX_TRANSPARENT; // 设置窗口 B 为透明
SetWindowLongPtr(hWndB, GWL_EXSTYLE, exStyle);
SetParent(hWndB, hWndA); // 将窗口 B 附着到窗口 A 上
```
需要注意的是,窗口 B 必须先设置为没有弹出式窗口的样式,然后再设置为子窗口的样式。另外,如果窗口 B 中有控件,则需要将控件的背景设置为透明,否则控件的背景仍然会显示。
相关问题
win32的setwindowlong用法详解 将透明窗口A叠加到 渲染了视频的窗口B上
win32的SetWindowLong是一个强大的API函数,它可以用于设置窗口的属性和风格。在本例中,我们将使用SetWindowLong将透明窗口A叠加到渲染了视频的窗口B上。
首先,我们需要创建一个透明窗口A,并且将其设置为透明。这可以通过在窗口类的WndProc函数中处理WM_PAINT消息并将背景设置为透明来完成。具体实现方法如下:
```c
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_PAINT:
{
HDC hdc;
PAINTSTRUCT ps;
hdc = BeginPaint(hWnd, &ps);
SetBkMode(hdc, TRANSPARENT);
TextOut(hdc, 0, 0, "Hello, World!", 13);
EndPaint(hWnd, &ps);
}
break;
case WM_ERASEBKGND:
return 1;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
return 0;
}
```
接下来,我们需要创建一个渲染了视频的窗口B。这可以通过使用DirectX或OpenGL等图形库来完成。在本例中,我们将假设已经有一个名为“VideoWnd”的窗口,该窗口已经渲染了视频。
现在,我们需要将透明窗口A叠加到窗口B上。这可以通过使用SetWindowLong函数来完成。具体实现方法如下:
```c
HWND hWndA = CreateWindowEx(
WS_EX_LAYERED | WS_EX_TRANSPARENT,
"TransparentWindowClass",
"Transparent Window",
WS_POPUP,
0, 0, 100, 100,
NULL, NULL, hInstance, NULL);
SetLayeredWindowAttributes(hWndA, RGB(255, 255, 255), 0xFF, LWA_COLORKEY | LWA_ALPHA);
SetWindowLongPtr(hWndA, GWLP_HWNDPARENT, (LONG_PTR)hWndB);
ShowWindow(hWndA, SW_SHOWNORMAL);
UpdateWindow(hWndA);
```
在上面的代码中,我们首先创建一个透明窗口A,并将其设置为透明。然后,我们使用SetWindowLong函数将透明窗口A的父窗口设置为窗口B。这将使透明窗口A出现在窗口B的上方。最后,我们使用ShowWindow和UpdateWindow函数显示透明窗口A。
通过上述方法,我们可以将透明窗口A叠加到渲染了视频的窗口B上。
win32的setwindowlong用法详解
`SetWindowLong`是一个Win32 API函数,可以用于设置窗口的扩展风格(extended window style)和窗口过程(window procedure)地址。下面是该函数的详细说明:
`LONG SetWindowLong(HWND hWnd, int nIndex, LONG dwNewLong);`
其中,`hWnd`是要设置的窗口的句柄,`nIndex`是要设置的信息的索引,`dwNewLong`是要设置的新值。
`nIndex`参数可以取下面的值:
- `GWL_EXSTYLE` :设置窗口的扩展风格。此参数可以用于设置不同的窗口样式(例如圆角窗口)。
- `GWL_HINSTANCE` :设置窗口实例的句柄。此参数通常用于与窗口关联的模块实例句柄。
- `GWL_ID` :设置窗口的标识符。此参数可以用于标识窗口并进行操作。
- `GWL_STYLE` :设置窗口的样式。此参数可以用于设置窗口的边框、标题、按钮等。
- `GWL_USERDATA` :设置窗口的用户数据。此参数通常用于存储与窗口相关的自定义数据。
- `GWL_WNDPROC` :设置窗口过程的地址。此参数通常用于自定义窗口过程,并替换默认的处理方式。
对于不同的`nIndex`参数,`dwNewLong`参数的含义也不同。例如,如果`nIndex`参数为`GWL_STYLE`,则`dwNewLong`参数应该包含要设置的窗口样式的具体值。
需要注意的是,`SetWindowLong`函数有两个版本:32位和64位。在64位版本中,该函数已被废弃,应该使用`SetWindowLongPtr`函数代替。另外,如果要获取窗口的扩展风格、样式等信息,可以使用`GetWindowLong`函数。