我正在做一个项目,要求我在屏幕上水平绘制一条细线并将其垂直拖动。为了增加一些个性,我尝试向窗口添加DWM玻璃效果,以使其与Windows 7和8中的窗口合并器匹配(尽管我知道在Windows 8中不会获得透明性)。
通过使用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窗口在玻璃填充得很好的内部获得所需的尺寸。
这里有一些错误:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句