2014-10-17 25 views
2

我正在处理一个项目,需要我在屏幕上水平绘制一条细线并垂直拖动它。为了增加一点天赋,我试图将DWM玻璃效果添加到窗口中,以便它将匹配Windows 7和8中的窗口boders(尽管我知道我不会在Windows 8中获得透明度)。如何将非客户区域扩展到比16像素薄的窗口?

我已经得到了通过创建与使用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); 

我已将窗口缩小到16像素的宽度,并带有所有漂亮的边框和投影效果我期望通过处理WM_GETMINMAXINFO消息并返回2作为ptMinTrackSize.x和y,但我可以看到围绕Windows边框似乎没有那么小。

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

由于每个边框的宽度都是8个像素,所以看起来我可能会受到边框尺寸的限制。

任何帮助,非常感谢!

+0

实际发生在16像素以下时会发生什么? – 2014-10-17 20:10:16

+0

窗口显示为16像素高。我应该注意到窗口没有被边框包围,因为我处理WM_NCCALCSIZE返回0,所以我的窗口大小发生在创建时。 – gitbox 2014-10-17 21:32:56

回答

0

我找到了我的答案,所以我会把它留在别人需要它的机会。我只需拨打DwmSetWindowAttribute(hwmd, DWMWA_NCRENDERING_POLICY, DWMNCRP_ENABLED, sizeof(int));即可确保DWM渲染策略不基于窗口风格。这使我可以使用WS_POPUP窗口来获得我想要的大小,并使用充满玻璃的内部空间。

这里有几个错误:

  1. 有沿顶部和底部的一个奇怪的影子,如果窗口的Y尺寸比16px的小。
  2. 在Vista \ 7上,圆形的窗口边缘给窗户一个奇怪的椭圆形状。
相关问题