我注册了这样的窗口类:
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);
在绘画部分,我在窗口上绘制图标:
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
做什么吗?
有没有人知道如何让它发挥作用?
感谢, 人
答案 0 :(得分:2)
仅仅让背景保持未上漆是不够的;你还需要在你的下面窗口,以便在必要时重新绘制自己。
如果窗口是由同一个线程创建的同一层次结构的一部分,则为窗口提供WS_EX_TRANSPARENT
扩展样式就足够了。这会导致下面的窗口首先自行绘制,因此背景始终是最新的。
否则您需要使用SetWindowRgn
,以便您的窗口实际上不存在于您想要绘制的边框之外。
答案 1 :(得分:1)
看看Layered Window。此功能允许创建不同形状的半透明窗口。
在窗口类中添加WS_EX_LAYERED
扩展属性。
您可以使用以下两个功能控制窗口的透明度:
bAlpha
中传递LWA_ALPHA
,则 dwFlags
会控制整个窗口的不透明度。
当bAlpha为0时,窗口完全透明。当bAlpha为255时,窗口是不透明的。
crKey
设置透明的颜色。
窗口以此颜色绘制的所有像素都是透明的。
UpdateLayeredWindow
可让您精确控制窗口透明度,您可以为窗口的不同部分提供不同级别的透明度。
答案 2 :(得分:0)
如果您尝试创建非矩形窗口,这还不够。设置“无背景”只是意味着不会绘制背景,并且您将看到在该位置内存中发生的任何事情。
要创建非矩形窗口,请查看SetWindowRgn
函数。