具有透明客户端区域的窗口
window with transparent client area
我像这样注册窗口类:
WNDCLASSEX wctt;
wctt.cbSize = sizeof(WNDCLASSEX);
wctt.style = CS_DBLCLKS;
wctt.lpfnWndProc = WndProcTooltip;
wctt.cbClsExtra = 0;
wctt.cbWndExtra = 0;
wctt.hInstance = m_hAppInstance;
wctt.hIcon = NULL;
wctt.hCursor = LoadCursor(NULL, IDC_SIZE);
wctt.hbrBackground = NULL;
wctt.lpszMenuName = NULL;
wctt.lpszClassName = _T("myWindow");
wctt.hIconSm = NULL;
RegisterClassEx(&wctt)
你可以看到我使用wctt.hbrBackground = NULL
;所以它没有背景。
窗口是这样创建的:
::CreateWindowEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW,
_T("myWindow"),
NULL,
WS_VISIBLE | WS_POPUP,
50,
50,
150,
100,
NULL,
NULL,
m_hAppInstance,
NULL);
在paint部分,我在窗口上画了一个图标:
PAINTSTRUCT ps;
HDC hdc;
BITMAP bitmap;
ICONINFO iconinfo;
hdc = ::BeginPaint(hWnd, &ps);
::SetBkMode(hdc,TRANSPARENT);
::GetIconInfo(localIcon, &iconinfo);
::GetObject(iconinfo.hbmColor, sizeof(bitmap), &bitmap);
::DeleteObject(iconinfo.hbmColor);
::DeleteObject(iconinfo.hbmMask);
::DrawIconEx(hdc, 0,0, localIcon, bitmap.bmWidth, bitmap.bmHeight, 0, NULL, DI_NORMAL);
图标的大小小于窗口的大小,我在背景上得到当前视图的窗口下面的弹出。
但是现在,当我移动窗口(或最小化窗口下方的弹出)的背景没有改变。
我试图做一个计时器,每次做流动:
RECT rcClient;
GetClientRect(hWnd, &rcClient);
InvalidateRect(hWnd,&rcClient,TRUE);
这将使打印函数再次运行,但图标的背景不会改变。
我应该在WM_ERASEBKGND
中做些什么吗?
有人知道怎么让它工作吗?
谢谢,家伙
仅仅让背景保持不上色是不够的;你还需要让下面的窗口在必要时重新粉刷自己。
如果窗口是同一层次结构的一部分,由同一线程创建,它足以给你的窗口WS_EX_TRANSPARENT
扩展样式。这将导致下面的窗口首先绘制自己,因此背景始终是最新的。
否则你需要使用SetWindowRgn
,这样你的窗口实际上不存在于你想画的边界之外。
查看分层窗口。此功能允许创建不同形状的半透明窗口。
在你的窗口类中添加WS_EX_LAYERED
扩展属性
你可以用下面两个函数来控制窗口的透明度:
-
SetLayeredWindowAttributes
:-
bAlpha
控制整个窗口的不透明度,如果你在dwFlags
中传递LWA_ALPHA
。当alpha为0时,窗口是完全透明的。当alpha值为255时,该窗口是不透明的。
-
crKey
设置透明的颜色。窗口绘制的所有像素都是透明的。
-
-
UpdateLayeredWindow
给你精确的控制窗口透明度,你可以给窗口的不同部分不同的透明度水平。
如果您试图创建一个非矩形窗口,这是不够的。设置"no background"仅仅意味着背景不会被绘制,你会看到内存中那个位置发生了什么。
要创建一个非矩形窗口,请看SetWindowRgn
函数
- 我的主窗口在创建时或单击更新区域时是否会收到编辑控件?
- 如何给主窗口区域DKGRAY_BRUSH?
- PDCurses 窗口在某些区域不打印字母
- DX9从全屏切换到窗口,给出了错误的客户端区域
- c++ SDL - 在窗口的特定区域内呈现
- 如何禁用窗口在区域内移动
- 如何在QML无窗口应用程序中设置拖放区域
- 在弹出窗口中管理CEF客户端区域的窗口消息
- 获取确切的窗口区域大小 - 创建窗口窗口大小不正确
- 仅截取窗口的特定区域
- 如何限制窗口的文本区域
- 在窗口的某个区域上使用 UpdateLayeredWindow
- Qt5-如何在无框窗口中指定一些可拖动区域
- 如何使用GLFW确定OpenGL 3.3窗口的可绘制区域的大小
- 为什么当窗口在win32上失去焦点时,被覆盖的非客户端区域显示默认值
- 用互联网浏览器的客户端区域填充窗口的客户端区域
- 当GLFW窗口调整大小时,渲染区域不会改变
- 不占用客户端区域的子窗口
- 如何使用grabWindow只截取窗口的某个区域的截图
- 无 Unicode 库和窗口区域设置