c++ - 是否可以创建一个只有边框的 winapi 窗口

标签 c++ winapi dxgi

因此,我正在尝试创建一个仅显示其边框并让主体的其余部分透明的窗口。 我已经创建了一个在我脑海中看起来像的模型:

Transparent window, only displaying a border and showing whatever would be underneath it

我尝试在具有透明像素的缓冲区中进行 blitting,但没有达到预期的效果。

有什么想法吗?

最佳答案

这可以通过传递 WS_EX_NOREDIRECTIONBITMAP 来实现1 将窗口样式扩展到对 CreateWindowEx 的调用.这可以防止系统为窗口的客户区分配渲染表面,使客户区完全透明。

请注意,这不会使窗口对鼠标点击透明。 HitTest 仍然由窗口控制,即使它没有可见的客户区。

以下代码提供了一个展示使用的最小代码示例:

#define UNICODE
#include <Windows.h>
#pragma comment(lib, "user32.lib")

int CALLBACK wWinMain(HINSTANCE hInstance, HINSTANCE, LPWSTR, int) {

    WNDCLASSW wc{};
    wc.hCursor = ::LoadCursorW(nullptr, IDC_ARROW);
    wc.hInstance = hInstance;
    wc.lpszClassName = L"TransparentWindow";
    wc.lpfnWndProc = [](HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) -> LRESULT
    {
        switch (message) {
        case WM_DESTROY:
            ::PostQuitMessage(0);
            return 0;
        default:
            return ::DefWindowProcW(hWnd, message, wParam, lParam);
        }
    };
    ::RegisterClassW(&wc);

    ::CreateWindowExW(WS_EX_NOREDIRECTIONBITMAP, wc.lpszClassName, L"Transparent window",
                      WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                      CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                      nullptr, nullptr, hInstance, nullptr);

    MSG msg{};
    while (::GetMessageW(&msg, nullptr, 0, 0) > 0) {
        ::DispatchMessageW(&msg);
    }

    return msg.wParam;
}

这会产生类似于以下屏幕截图的输出:

Screenshot of sample application


有关内部结构以及常见用例的更多信息,请参阅 Kenny Kerr 2014 年 6 月在 MSDN 杂志上发表的优秀文章 Windows with C++ : High-Performance Window Layering Using the Windows Composition Engine .


1 这需要启用桌面组合。桌面组合在所有受支持的 Windows 版本中可用,但在 Windows 8 之前可以由用户/系统管理员禁用。

关于c++ - 是否可以创建一个只有边框的 winapi 窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49380566/

相关文章:

c++ - 为什么我不能在 VS.NET 调试器中单步执行剪贴板代码?

c++ - 从 winapi 套接字正确接收

c++ - 调用 MapViewOfFile 时出错

delphi - Windows 7 上 WTSOpenServer 发生奇怪崩溃(仅在 Delphi 2009/2010 中)

c++ - DXGI AcquireNextFrame 仅在 20ms (50fps) 后才接收下一帧,是否可以加速到 10ms?

c++ - 优化迭代器定义

c++ - 在 centOS7 上安装 ceres-solver 并让 helloworld.cc 工作

c++ - 性能受文件解析线程的影响可能是由于 std::string 堆分配?

c++ - 当某些应用程序处于全屏模式时,DesktopDuplication API 会产生黑框

c++ - DirectX:在设备之前获取InfoQueue