Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 具有透明客户端区域的窗口_C++_Winapi_Background_Window - Fatal编程技术网

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