如何将非客户区扩展到比16像素更薄的窗口?

我正在做一个项目,需要我在屏幕上水平地画一条细线,并垂直拖动它。 添加一点天赋我试图添加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窗口来获得我想要的大小,并用一个很好的玻璃填充内部。

这里有一些错误:

  1. 如果窗口的Y尺寸小于16px,则沿顶部和底部会有一个奇怪的阴影。
  2. 在Vista \ 7上,圆形窗口边缘给窗口一个奇怪的椭圆形状。