我正在做一个项目,需要我在屏幕上水平地画一条细线,并垂直拖动它。 添加一点天赋我试图添加DWM玻璃效果的窗口,以便它将匹配Windows 7和8窗口boders(虽然我知道我不会在Windows 8中获得透明度)。
我已经通过使用DwmExtendFrameIntoClientArea 的玻璃技巧创build一个非客户区扩展到客户区的子窗口来绘制线条,如下所示:
MARGINS margins = { -1, -1, -1, -1 }; DwmEnableComposition(DWM_EC_ENABLECOMPOSITION); DwmExtendFrameIntoClientArea(DIV_HWND, &margins);
我创build这样的窗口:
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);
我已经把窗口缩小到16像素的宽度,所有漂亮的边框和阴影效果,我期望通过处理WM_GETMINMAXINFO消息并返回2作为ptMinTrackSize.x和y,但我不能似乎比它小。
我可以通过在我用SetWindowRgn设置的区域上使用DwmEnableBlurBehindWindow来获得一个“玻璃状的”窗口,但是即使它在焦点上,颜色也是背景窗口的颜色。 另外我错过了轻微的投影和边框。
由于每个边框的宽度都是8个像素,所以我可能会因边框尺寸而受到尺寸限制。
任何帮助是极大的赞赏!
我找到了我的答案,所以我会把它留在别人需要的地方。 我所要做的就是调用DwmSetWindowAttribute(hwmd, DWMWA_NCRENDERING_POLICY, DWMNCRP_ENABLED, sizeof(int));
以确保DWM呈现策略不基于窗口风格。 这使我可以使用一个WS_POPUP窗口来获得我想要的大小,并用一个很好的玻璃填充内部。
这里有一些错误: