3

我像这样注册窗口类:

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吗?
有谁知道如何使它工作?

谢了,兄弟们

4

3 回答 3

3

仅仅让背景保持未上色是不够的;您还需要在必要时让您下方的窗口重新绘制自己。

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

否则,您需要使用SetWindowRgn以使您的窗口实际上不存在于您要绘制的边界之外。

于 2012-12-26T17:47:59.977 回答
2

看看分层窗口。此功能允许创建不同形状的半透明窗口。

在您的窗口类中添加WS_EX_LAYERED扩展属性。

您可以使用以下两个功能控制窗口的透明度:

  1. SetLayeredWindowAttributes

    1. bAlpha控制整个窗口的不透明度,如果你传入 LWA_ALPHA.dwFlags

      当 bAlpha 为 0 时,窗口是完全透明的。当 bAlpha 为 255 时,窗口是不透明的。

    2. crKey设置透明的颜色。

      窗口以这种颜色绘制的所有像素都是透明的。

  2. UpdateLayeredWindow为您提供对窗口透明度的精确控制,您可以为窗口的不同部分赋予不同级别的透明度。

于 2012-12-26T18:18:50.523 回答
0

如果您尝试创建一个非矩形窗口,这还不够。设置“无背景”只是意味着不会绘制背景,您会看到该位置内存中发生的任何事情。

要创建非矩形窗口,请查看SetWindowRgn函数。

于 2012-12-26T17:30:26.577 回答