duilib : 滑动显示的窗口实现

来源:互联网 发布:免费配货软件下载 编辑:程序博客网 时间:2024/05/19 16:02

前几天jhgwqp@csdn留言, 问有没有Demo工程. 做了一个给他.
原来记录这个技术点时, 也想做个Demo留念. 随着时间的推移, 已经忘了这事.

经jhgwqp@csdn提醒, 将这事做了.

工程下载点: srcbk_2015_0722_1819_src-sliding-window-display.rar

编译环境: vs2010 vc++ duilib

效果图:


代码预览:

建立弹出的滑动对话框时, 要以子窗口风格创建, 这样, 主窗口移动时, 我们就不用负责子窗口的位置移动了.

[cpp] view plaincopy
  1. void CMainDlg::CreateDlgSlidingShow()  
  2. {  
  3.     do   
  4.     {  
  5.         if (NULL != m_pDlgSlidingShow)  
  6.             break;  
  7.   
  8.         m_pDlgSlidingShow = new CDlgSlidingShow(  
  9.             XML_FILE_NAME_dlgSlidingShow_MainDlg,   
  10.             WND_CLASS_NAME_dlgSlidingShow_MainDlg);  
  11.   
  12.         if (NULL == m_pDlgSlidingShow)  
  13.             break;  
  14.   
  15.         m_pDlgSlidingShow->SetOwner(this);  
  16.         m_pDlgSlidingShow->Create(  
  17.             this->GetHWND(),  
  18.             WND_DISP_NAME_dlgSlidingShow_MainDlg,  
  19.             UI_WNDSTYLE_CHILD,  
  20.             WS_EX_WINDOWEDGE);  
  21.   
  22.         /// 先藏起来, 让滑动框自己滑动和显示隐藏, 要不起始位置不对  
  23.         /// 所有者没必要之道创建对象的起始条件  
  24.         m_pDlgSlidingShow->ShowWindow(falsefalse);  
  25.     } while (0);  
  26. }  
在消息中处理子窗口的滑动显示, 对DuiLib的显示操作, 最好放在消息中处理, 防止崩溃.

[cpp] view plaincopy
  1. LRESULT CDlgSlidingShow::WndMessageProc_SlidingShow(UINT uMsg, WPARAM wParam, LPARAM lParam)  
  2. {  
  3.     /// 实现一个非模态窗口垂直滑动显示在指定父控件窗口里面  
  4.     /// * 从下到上,从最小高度到最大高度  
  5.     /// * 然后稳定显示x秒  
  6.     /// * 然后从上到下, 从最大高度到最小高度  
  7.     /// * 消失  
  8.   
  9.     RECT    rtMain;         ///< 主窗口size  
  10.     RECT    rtLayout;       ///< 100%显示在父控件下方的大小  
  11.     RECT    rtLayoutRate;   ///< 窗口滑动时, 不通比率下的显示size  
  12.     const   UINT uDispTimeMax = 1000 * 6;   ///< 滑动显示窗稳定显示时间  
  13.   
  14.     /// 垂直显示比率步进值, 控制窗口滑动速度  
  15.     /// 这里设定是每10MS, 执行一次 Play()  
  16.     const   float fDispStep = 0.03f;           
  17.     const   UINT uMinHeight = 10;           ///< 最小窗口高度  
  18.   
  19.     /// 最小高度限制的应对, 开始显示和结束显示的是最小高度  
  20.     const   float fRateMin =  0.05f;    ///< fRateMin 比率对应最小窗口高度  
  21.     static  UINT uDispTimeTotal = 0;    ///< 稳定显示的时间计数  
  22.   
  23.     do   
  24.     {  
  25.         if (!m_bPlay)  
  26.             break;  
  27.   
  28.         if (eDispStatus_inc == m_Status)  
  29.         {  
  30.             m_fRate += fDispStep;  
  31.             if (m_fRate > 1.0f)  
  32.             {  
  33.                 m_fRate = 1.0f;  
  34.                 uDispTimeTotal = 0;  
  35.                 m_Status = eDispStatus_disp;  
  36.             }  
  37.             else if (m_fRate < fRateMin)  
  38.                 m_fRate = fRateMin;  
  39.         }  
  40.         else if (eDispStatus_disp == m_Status)  
  41.         {  
  42.             uDispTimeTotal += TIMER_DELAY_PLAY;  
  43.             if (uDispTimeTotal >= uDispTimeMax)  
  44.                 m_Status = eDispStatus_dec;  
  45.         }  
  46.         else if (eDispStatus_dec == m_Status)  
  47.         {  
  48.             m_fRate -= fDispStep;  
  49.             if (m_fRate <= fRateMin)  
  50.             {  
  51.                 m_fRate = fRateMin;  
  52.                 uDispTimeTotal = 0;  
  53.                 m_Status = eDispStatus_inc;  
  54.                 m_bPlay = FALSE;  
  55.             }  
  56.         }  
  57.   
  58.         // ::GetWindowRect(m_pOwner->GetHWND(), &rtMain);  
  59.         ::GetClientRect(m_pOwner->GetHWND(), &rtMain);  
  60.   
  61.         rtLayout.right = rtMain.right;  
  62.         rtLayout.bottom = rtMain.bottom;  
  63.         rtLayout.left = rtLayout.right - (m_rtMeOrg.right - m_rtMeOrg.left);  
  64.         rtLayout.top = rtLayout.bottom - (m_rtMeOrg.bottom - m_rtMeOrg.top);  
  65.   
  66.         rtLayoutRate.left = rtLayout.left;  
  67.         rtLayoutRate.right = rtLayout.right;  
  68.         rtLayoutRate.bottom = rtLayout.bottom;  
  69.         rtLayoutRate.top = rtLayout.bottom - 1.0f * (rtLayout.bottom - rtLayout.top) * m_fRate;  
  70.   
  71.         /// 界面库的限制吧 ? 无法设置成很低的高度, 有最小高度限制...  
  72.         /// 重载 OnGetMinMaxInfo 也没用  
  73.         /// 通过试验, 发现最小高度为10左右  
  74.   
  75.         /// 作为所有者的非子窗口(~UI_WNDSTYLE_CHILD), 用SetWindowPos  
  76.         /// 如果是非子窗口, 位置也要重新实验一下, 不能用::GetClientRect.  
  77.         /// 要用::GetWindowRect  
  78. //         ::SetWindowPos(  
  79. //             this->GetHWND(),   
  80. //             m_pOwner->GetHWND(),   
  81. //             rtLayoutRate.left,   
  82. //             rtLayoutRate.top,   
  83. //             rtLayoutRate.right - rtLayoutRate.left,   
  84. //             rtLayoutRate.bottom - rtLayoutRate.top,   
  85. //             SWP_SHOWWINDOW);  
  86.   
  87.         /// 作为所有者的子窗口(UI_WNDSTYLE_CHILD), 用MoveWindow  
  88.         ::MoveWindow(  
  89.             this->GetHWND(),   
  90.             rtLayoutRate.left,   
  91.             rtLayoutRate.top,   
  92.             rtLayoutRate.right,   
  93.             rtLayoutRate.bottom,   
  94.             TRUE);  
  95.   
  96.         ::ShowWindow(this->GetHWND(), m_bPlay ? SW_SHOW : SW_HIDE);  
  97.         if (!m_bPlay)  
  98.         {  
  99.             ::PostMessageW(this->GetHWND(), WM_CLOSE, 0, 0);  
  100.         }  
  101.     } while (0);  
  102.   
  103.     return S_OK;  
  104. }  




2014-03-28 03:23 的备份

[cpp] view plaincopy
  1. void CFloatTextMsgDlg::Play()  
  2. {  
  3.     /// 实现一个非模态窗口垂直滑动显示在指定父控件窗口里面  
  4.     /// * 从下到上,从最小高度到最大高度  
  5.     /// * 然后稳定显示x秒  
  6.     /// * 然后从上到下, 从最大高度到最小高度  
  7.     /// * 消失  
  8.   
  9.     RECT    rtTabView;      ///< 要显示的父控件size  
  10.     RECT    rtMain;         ///< 主窗口size  
  11.     RECT    rtLayout;       ///< 100%显示在父控件下方的大小  
  12.     RECT    rtLayoutRate;   ///< 窗口滑动时, 不通比率下的显示size  
  13.     const   UINT uDispTimeMax = 1000 * 6;   ///< 滑动显示窗稳定显示时间  
  14.   
  15.     /// 垂直显示比率步进值, 控制窗口滑动速度  
  16.     /// 这里设定是每10MS, 执行一次 Play()  
  17.     const   float fDispStep = 0.03f;           
  18.     const   UINT uMinHeight = 10;           ///< 最小窗口高度  
  19.       
  20.     /// 最小高度限制的应对, 开始显示和结束显示的是最小高度  
  21.     const   float fRateMin =  0.05f;    ///< fRateMin 比率对应最小窗口高度  
  22.     static  UINT uDispTimeTotal = 0;    ///< 稳定显示的时间计数  
  23.       
  24.     if (!m_bPlay)  
  25.         return;  
  26.   
  27.     if (eDispStatus_inc == m_Status)  
  28.     {  
  29.         m_fRate += fDispStep;  
  30.         if (m_fRate > 1.0f)  
  31.         {  
  32.             m_fRate = 1.0f;  
  33.             uDispTimeTotal = 0;  
  34.             m_Status = eDispStatus_disp;  
  35.         }  
  36.         else if (m_fRate < fRateMin)  
  37.             m_fRate = fRateMin;  
  38.     }  
  39.     else if (eDispStatus_disp == m_Status)  
  40.     {  
  41.         uDispTimeTotal += TIMER_DELAY_PLAY;  
  42.         if (uDispTimeTotal >= uDispTimeMax)  
  43.             m_Status = eDispStatus_dec;  
  44.     }  
  45.     else if (eDispStatus_dec == m_Status)  
  46.     {  
  47.         m_fRate -= fDispStep;  
  48.         if (m_fRate <= fRateMin)  
  49.         {  
  50.             m_fRate = fRateMin;  
  51.             uDispTimeTotal = 0;  
  52.             m_Status = eDispStatus_inc;  
  53.             m_bPlay = FALSE;  
  54.         }  
  55.     }  
  56.   
  57.     m_pOwner->GetTabViewFramePosition(rtTabView);  
  58.     ::GetWindowRect(m_pOwner->GetHWND(), &rtMain);  
  59.   
  60.     rtLayout.left = rtMain.left + rtTabView.left;  
  61.     rtLayout.right = rtLayout.left + (m_rtMeOrg.right - m_rtMeOrg.left);  
  62.     rtLayout.top = rtMain.top + rtTabView.bottom - (m_rtMeOrg.bottom - m_rtMeOrg.top);  
  63.     rtLayout.bottom = rtMain.top + rtTabView.bottom;  
  64.   
  65.     rtLayoutRate.left = rtLayout.left;  
  66.     rtLayoutRate.right = rtLayout.right;  
  67.     rtLayoutRate.bottom = rtLayout.bottom;  
  68.     rtLayoutRate.top = rtLayout.bottom - 1.0f * (rtLayout.bottom - rtLayout.top) * m_fRate;  
  69.   
  70.     /// 界面库的限制吧 ? 无法设置成很低的高度, 有最小高度限制...  
  71.     /// 重载 OnGetMinMaxInfo 也没用  
  72.     /// 通过试验, 发现最小高度为10左右  
  73.   
  74.     ::SetWindowPos(  
  75.         this->GetHWND(),   
  76.         m_pOwner->GetHWND(),   
  77.         rtLayoutRate.left,   
  78.         rtLayoutRate.top,   
  79.         rtLayoutRate.right - rtLayoutRate.left,   
  80.         rtLayoutRate.bottom - rtLayoutRate.top,   
  81.         SWP_SHOWWINDOW);  
  82.   
  83.     ::ShowWindow(this->GetHWND(), m_bPlay ? SW_SHOW : SW_HIDE);  
  84. }  
0 0
原创粉丝点击