【问题标题】:Win32 C++ SetLayeredWindowAttributes is either fully opaque or fully transparent; nothing in betweenWin32 C++ SetLayeredWindowAttributes 要么完全不透明,要么完全透明;中间什么都没有
【发布时间】:2012-02-05 22:45:48
【问题描述】:

所以我在我的程序中创建了第二个窗口,例如:

#define WINDOW_CLASS_NAME "WINCLASSFULL"

WNDCLASSEX winclass;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

some function {

HINSTANCE hInstance = (HINSTANCE)GetModuleHandle(NULL);

// first fill in the window class stucture

winclass.cbSize         = sizeof(WNDCLASSEX);
winclass.style          = CS_DBLCLKS | CS_OWNDC | 
                          CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc    =WndProc;
winclass.cbClsExtra = 0;                        //reserve data space
winclass.cbWndExtra = 0;                        //
winclass.hInstance  = hInstance;                //set instance of application
winclass.hIcon      = NULL;
winclass.hCursor    = LoadCursor(NULL, IDC_ARROW);         //load cursor type
winclass.hbrBackground  = (HBRUSH)GetStockObject(BLACK_BRUSH); //set background brush
winclass.lpszMenuName   = NULL;                               
winclass.lpszClassName  = WINDOW_CLASS_NAME;                 //set Windows class name
winclass.hIconSm        = NULL;

hWnd= CreateWindowEx(WS_EX_LAYERED,                  // extended style
                            WINDOW_CLASS_NAME,     // class
                            "Demo", // title
                            WS_POPUP,
                            x,y,
                            width,height,
                            NULL,
                            NULL, 
                            hInstance,// instance of this application
                            NULL))) // extra creation parms

}

现在我的问题是如果我申请

其中 255 可以是 1-255 之间的任何值

SetLayeredWindowAttributes(hWnd,RGB(0,0,0),255,LWA_COLORKEY|LWA_ALPHA)

窗户完全不透明,我看不到它后面的任何东西

这是完全透明的:

SetLayeredWindowAttributes(hWnd,RGB(0,0,0),0,LWA_COLORKEY|LWA_ALPHA)

我怎样才能得到

SetLayeredWindowAttributes(hWnd,RGB(0,0,0),128,LWA_COLORKEY|LWA_ALPHA)

工作 - 即我可以部分看到顶部的窗户;并部分看到它后面的窗户。我在这里查看了 MSDN 上的文档,但我显然遗漏了一些东西 Refer Microsoft Library

【问题讨论】:

  • 为什么这些人在 2012 年编译 Windows 应用程序时没有定义 UNICODE?如果您没有设置透明颜色,为什么还要包含LWA_COLORKEY
  • stackoverflow.com/questions/3967003/… 包含一些有用的信息;它不是这个问题的重复,但涉及到同一类型的问题。
  • 您是否阅读了您提供的链接中的“社区补充”?我认为它给了你答案,你不应该将LWA_COLORKEYLWA_ALPHA 结合起来。
  • 没有复制,我得到一个透明窗口,只有边框和标题可见。正如预期的那样,您将黑色设置为颜色键。正如预期的那样,第二版产生了一个完全不可见的窗口。正如预期的那样,第三版产生部分可见的边框和完全透明的内部。记录 Windows 版本并明确在哪里您放置了 SetLayeredWindowAttributes() 调用。
  • 我没有想到什么会破坏这个。按照 Hans 的建议执行并发布包含 SetLayeredWindowAttributes 调用的代码,以便我们可以在上下文中看到它。

标签: c++ winapi createwindow


【解决方案1】:

尝试仅指定LWA_ALPHA, 而不是同时指定LWA_COLORKEYLWA_ALPHA

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多