c++ - 带有透明客户区的窗口

标签 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         = 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);

图标尺寸小于窗口尺寸,我在弹出窗口下方的窗口中获得当前 View 的背景。

但现在当我移动窗口(或最小化弹出窗口下方的窗口)时,背景没有改变。

我试图制作一个每次都进行流动的计时器:

RECT rcClient;
GetClientRect(hWnd, &rcClient);
InvalidateRect(hWnd,&rcClient,TRUE);

这使得打印功能再次运行,但图标的背景没有改变。

我应该在 WM_ERASEBKGND 中做些什么吗?
有谁知道如何让它发挥作用吗?

谢谢, 家伙

最佳答案

仅仅让背景不绘制(paint)是不够的;您还需要让您的窗口下方在必要时重新绘制自身。

如果窗口是同一个层次结构的一部分,由同一个线程创建,那么给你的窗口 WS_EX_TRANSPARENT 就足够了扩展样式。这会导致下面的窗口首先绘制自身,因此背景始终是最新的。

否则你需要使用SetWindowRgn这样您的窗口实际上就不会存在于您要绘制的边界之外。

关于c++ - 带有透明客户区的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14043921/

相关文章:

javascript - 为什么之前的背景颜色记录在变量C中?

c++ - operator[] 和 insert() 函数在 C++ 映射中的行为方式不应该相同吗?

windows - 如何知道平板电脑是 'Laptop'还是 'Tablet'模式

html - 为什么我的 UL 子菜单采用其祖 parent 的背景?

c++ - 使用 Win32 C++ 访问 protected 网络共享

c# - C# 中用于获取 CPU ID 和驱动器/卷序列号的 API

html - 内容区域不覆盖内容框

c++ - 通过 Berkeley 套接字使用线程通知

c++ - 如何删除包含结构的 map 或包含结构的 map ?

c++ - 如何将枚举值分配给用户定义的 double 变量?? C++