duilib支持窗体阴影,有算法和图片两种
算法阴影的效果不行,处理效果太老,目前比较流行的是高斯模糊后的阴影效果。在iMac里早已系统内置,对于Windows,尤其是duilib这种自绘的库,只能自己去画阴影。
Duilib设置窗体阴影
使用算法阴影.
xml配置:
shadow="true" shadowsize="20" shadowdarkness="20" shadowsharpness="30" shadowposition="0,6"
效果如下图,阴影的渐变还是有所欠缺,所以目前推荐使用图片的阴影,自由度很高
使用图片阴影
先准备个阴影图片,图片尺寸不限,因为可以通过设置点九图数据来拉伸
xml配置
showshadow="true" shadowimage="shadow.png" shadowcorner="30,20,30,40"
其中,shadowcorner就是点九图信息,根据自己图片设置,数字分别是阴影到边框的距离,如阴影图我是用30半径高斯模糊,y偏移10,所以设置30,20,30,40。
效果如图,基本上可以模拟你想要的任何种类的阴影,前期是你会做阴影图-_-
重要!
在使用图片时会出现各种拉伸、偏移的情况,这里需要修改下源码UIShadow.cpp文件。
很明显是尺寸设置有误。
三个地方:
//update函数中,原代码还使用m_nSize计算宽高,这样需要使用点九图中的信息计算。
nShadWndWid = WndRect.right - WndRect.left + m_rcShadowCorner.left + m_rcShadowCorner.right;
nShadWndHei = WndRect.bottom - WndRect.top + m_rcShadowCorner.top + m_rcShadowCorner.bottom;
//两个移动窗口的消息中,移动出现偏移情况
//ParentProc函数中
//窗体位置改变(移动窗体结束的消息)
case WM_WINDOWPOSCHANGED:
RECT WndRect;
GetWindowRect(hwnd, &WndRect);
if (pThis->m_bIsImageMode) {
//修改此处
SetWindowPos(pThis->m_hWnd, 0, WndRect.left - pThis->m_rcShadowCorner.left, WndRect.top - pThis->m_rcShadowCorner.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
}
else {
SetWindowPos(pThis->m_hWnd, 0, WndRect.left + pThis->m_nxOffset - pThis->m_nSize, WndRect.top + pThis->m_nyOffset - pThis->m_nSize, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
}
break;
//窗体移动
c case WM_MOVE:
if(pThis->m_Status & SS_VISABLE)
{
RECT WndRect;
GetWindowRect(hwnd, &WndRect);
if (pThis->m_bIsImageMode) {
//修改此处
SetWindowPos(pThis->m_hWnd, 0, WndRect.left - pThis->m_rcShadowCorner.left, WndRect.top - pThis->m_rcShadowCorner.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
}
else {
SetWindowPos(pThis->m_hWnd, 0, WndRect.left + pThis->m_nxOffset - pThis->m_nSize, WndRect.top + pThis->m_nyOffset - pThis->m_nSize, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE);
}
}
break;
其实都是在m_bIsImageMode中,把m_nSize换成m_rcShadowCorner的参数。