gpt4 book ai didi

windows - 如何将非客户区扩展到小于 16 像素的窗口?

转载 作者:可可西里 更新时间:2023-11-01 10:45:50 25 4
gpt4 key购买 nike

我正在做一个项目,需要我在屏幕上水平绘制一条细线并垂直拖动它。为了增加一点风格,我尝试将 DWM 玻璃效果添加到窗口,以便它与 Windows 7 和 8 中的窗口边界相匹配(尽管我知道我不会在 Windows 8 中获得透明度)。

我通过使用 sheet of glass 创建一个非客户区扩展到客户区的子窗口来画线。像这样使用 DwmExtendFrameIntoClientArea 技巧:

MARGINS margins = { -1, -1, -1, -1 };
DwmEnableComposition(DWM_EC_ENABLECOMPOSITION);
DwmExtendFrameIntoClientArea(DIV_HWND, &margins);

我这样创建窗口:

HWND DIV_HWND = CreateWindow(DIV_NAME,
NULL,
WS_VISIBLE,
0, 0, mon_info.rcWork.right, mon_info.rcWork.top + 3,
top->hwnd, NULL,
hInstance, NULL);

像这样的窗口类:

const wchar_t DIV_NAME[] = L"DIV";

WNDCLASS DIV = {};
DIV.lpfnWndProc = DIV_PROC;
DIV.hInstance = hInstance;
DIV.lpszClassName = DIV_NAME;
DIV.hCursor = LoadCursor(NULL, IDC_SIZEALL);

RegisterClass(&DIV);

通过处理 WM_GETMINMAXINFO 消息并返回 2 作为 ptMinTrackSize.x 和 y,我已经将窗口缩小到 16 像素的宽度,并具有我希望在窗口边框周围看到的所有漂亮的边框和投影效果,但我似乎无法让它比这更小。

我可以通过在用 SetWindowRgn 设置的区域上使用 DwmEnableBlurBehindWindow 来获得一个“玻璃状”窗口,但即使它处于焦点中,颜色也是背景窗口的颜色。此外,我错过了轻微的阴影和边框。

由于每个边框的宽度为 8 像素,因此似乎我可能会因边框尺寸而达到尺寸限制。

非常感谢任何帮助!

最佳答案

我找到了我的答案,所以我会把它留在这里,以防其他人需要它。我所要做的就是调用 DwmSetWindowAttribute(hwmd, DWMWA_NCRENDERING_POLICY, DWMNCRP_ENABLED, sizeof(int)); 以确保 DWM 渲染策略不基于窗口样式。这让我可以使用 WS_POPUP 窗口来获得我想要的大小,以及漂亮的玻璃填充内部。

这里有一些错误:

  1. 如果窗口的 Y 尺寸小于 16px,则顶部和底部会有奇怪的阴影。
  2. 在 Vista\7 上,圆滑的窗口边缘使窗口呈现出奇怪的椭圆形。

关于windows - 如何将非客户区扩展到小于 16 像素的窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26432664/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com