C++ 具有透明客户端区域的窗口
我按如下方式注册窗口类:C++ 具有透明客户端区域的窗口,c++,winapi,background,window,C++,Winapi,Background,Window,我按如下方式注册窗口类: 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 = NUL
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)
::CreateWindowEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW,
_T("myWindow"),
NULL,
WS_VISIBLE | WS_POPUP,
50,
50,
150,
100,
NULL,
NULL,
m_hAppInstance,
NULL);
如您所见,我使用的是wctt.hbrBackground=NULL
;所以它没有背景
窗口的创建方式如下:
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)
::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
中做些什么吗?有人知道如何让它工作吗 谢谢,
guy如果要创建非矩形窗口,这是不够的。设置“no background”(无背景)只是意味着不会绘制背景,您将看到内存中该位置发生的任何事情
要创建非矩形窗口,请查看该函数。仅让背景保持不上漆是不够的;必要时,您还需要让您下方的窗口重新喷漆 如果窗口是由同一线程创建的同一层次结构的一部分,则为窗口提供扩展样式就足够了。这会导致下面的窗口首先绘制自身,因此背景始终是最新的 否则,您需要使用,以便您的窗口实际上不存在于您希望绘制的边界之外。查看。此功能允许创建不同形状的半透明窗口 在窗口类中添加扩展属性 您可以使用以下两个功能控制窗口的透明度:
bAlpha
如果在dwFlags
中通过LWA_ALPHA
,则控制整个窗口的不透明度
当bAlpha为0时,窗口是完全透明的。当bAlpha为255时,窗口是不透明的
crKey
设置透明的颜色
窗口以这种颜色绘制的所有像素都将是透明的
请注意,如果使用
NULL
作为rect调用invalidate
,则会使整个客户端rect无效。我知道,我希望所有客户端区域都无效。。。这不就是这样做的吗?这:invalidate(hWnd,NULL,TRUE)
相当于:RECT-rcClient;GetClientRect(hWnd和rcClient);无效安装(hWnd和rcClient,正确)代码>。没有错误,两者都是一样的…我应该在什么时候调用此函数?仅一次,在创建窗口后。我应该制作一个与我加载的图像兼容的Rgn吗?它看起来不错。。。我会在这方面再努力一点。谢谢:)我总是忘记分层窗口。我从来没有意识到它们是在Windows 2000中引入的。当我使用带有crKey的WS_EX_分层窗口时,图像和透明区域的边界不清晰,我们有一些透明颜色的剩余部分。@guymininberg你能发布屏幕截图吗?当您使用crKey
时,只有以该确切颜色绘制的区域将渲染为透明。如果您的图标有半透明区域,并且希望保留它们,则必须使用UpdateLayeredWindow
。