【发布时间】:2014-10-17 20:05:33
【问题描述】:
我正在做一个项目,该项目需要我在屏幕上水平绘制一条细线并垂直拖动它。为了增加一点风格,我尝试将 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 像素,因此似乎我可能会因边框大小而受到尺寸限制。
非常感谢任何帮助!
【问题讨论】:
-
当你低于 16 像素时会发生什么?
-
窗口显示为 16 像素高。我应该注意到窗口没有被边框包围,因为我已经处理了 WM_NCCALCSIZE 返回 0,所以我的窗口大小在创建时发生。
标签: windows winapi windows-8.1