找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 246|回复: 0

duilib入门简明教程 -- 自绘标题栏(5)

[复制链接]

52

主题

62

回帖

0

积分

版主

积分
0
发表于 2013-10-13 14:01:38 | 显示全部楼层 |阅读模式

如果大家有做过标题栏的自绘,肯定会感慨各种不容易,并且现有的一些资料虽然完美的实现了功能,但是代码比较乱,需要自行整理。如果用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.     }
复制代码
即可看到如下效果


[attachment=1197]




2、对于加入最小化最大化按钮等操作会在后面的教程里讲到,因为duilib已经提供了一个基础的类来实现常用的功能,所以这里就略过了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 14:02 , Processed in 0.090124 second(s), 21 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表