我正在处理一个项目,需要我在屏幕上水平绘制一条细线并垂直拖动它。为了增加一点天赋,我试图将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个像素,所以看起来我可能会受到边框尺寸的限制。
任何帮助,非常感谢!
实际发生在16像素以下时会发生什么? – 2014-10-17 20:10:16
窗口显示为16像素高。我应该注意到窗口没有被边框包围,因为我处理WM_NCCALCSIZE返回0,所以我的窗口大小发生在创建时。 – gitbox 2014-10-17 21:32:56