duilib教程之duilib入门简明教程5.自绘标题栏

一曲冷凌霜 提交于 2019-11-28 20:39:20

如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了功能,但是代码比较乱,需要自行整理。如果用duilib,就是小case啦。    duilib其实并没有区分标题栏和客户区,它的实现方法是屏蔽了系统自带的标题栏,用客户区来模拟标题栏,所以想怎么画就怎么画,非常方便。
    1、我们首先屏蔽一下系统自带的标题栏,
         在HandleMessage函数里屏蔽以下三个消息即可 WM_NCACTIVATE、WM_NCCALCSIZE、WM_NCPAINT
代码如下:    

  1. virtual LRESULT HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
  2.     {
  3.         LRESULT lRes = 0;
  4.         if( uMsg == WM_CREATE ) 
  5.         {
  6.             CControlUI *pWnd = new CButtonUI;
  7.             pWnd->SetName(_T("btnHello"));      // 设置控件的名称,这个名称用于标识每一个控件,必须唯一,相当于MFC里面的控件ID
  8.             pWnd->SetText(_T("Hello World"));   // 设置文字
  9.             pWnd->SetBkColor(0xFF00FF00);       // 设置背景色
  10.             m_PaintManager.Init(m_hWnd);
  11.             m_PaintManager.AttachDialog(pWnd);
  12.             m_PaintManager.AddNotifier(this);   // 添加控件等消息响应,这样消息就会传达到duilib的消息循环,我们可以在Notify函数里做消息处理
  13.             return lRes;
  14.         }
  15.         // 以下3个消息WM_NCACTIVATE、WM_NCCALCSIZE、WM_NCPAINT用于屏蔽系统标题栏
  16.         else if( uMsg == WM_NCACTIVATE ) 
  17.         {
  18.             if( !::IsIconic(m_hWnd) ) 
  19.             {
  20.                 return (wParam == 0) ? TRUE : FALSE;
  21.             }
  22.         }
  23.         else if( uMsg == WM_NCCALCSIZE ) 
  24.         {
  25.             return 0;
  26.         }
  27.         else if( uMsg == WM_NCPAINT ) 
  28.         {
  29.             return 0;
  30.         }
  31.         if( m_PaintManager.MessageHandler(uMsg, wParam, lParam, lRes) ) 
  32.         {
  33.             return lRes;
  34.         }
  35.         return __super::HandleMessage(uMsg, wParam, lParam);
  36.     }
复制代码



即可看到如下效果
 

    2、对于加入最小化最大化按钮等操作会在后面的教程里讲到,因为duilib已经提供了一个基础的类来实现常用的功能,所以这里就略过了。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!