http://www.duilib.com/ duilib官网。
class C360SafeFrameWnd : public CWindowWnd, public INotifyUI

  主窗口类继承于 INotifyUI类。

  在窗口类中实现函数Notify()

void Notify(TNotifyUI& msg)

  在Notify函数中根据msg消息的发送者/消息类型,判断按钮,并写功能代码。

在主窗口类C360SafeFrameWnd的OnCreate实现中:

     CControlUI* pRoot = builder.Create(tstrSkin.c_str(), (UINT)0,  &cb, &m_pm);    //加载XML并动态创建界面无素,与布局界面元素ASSERT(pRoot && _T("Failed to parse XML"));m_pm.AttachDialog(pRoot); //控件与m_pm(CPaintMangerUI)关联//这里间接设置控件的CPaintManagerUI???//会间接CPaintManagerUI的InitControls(pControl);

  CPaintMnagerUI的InitControls函数中调用CControlUI的SetManager,这样控件就与m_pm相关联。

bool CPaintManagerUI::InitControls(CControlUI* pControl, CControlUI* pParent /*= NULL*/)
{ASSERT(pControl);if( pControl == NULL ) return false;pControl->SetManager(this, pParent != NULL ? pParent : pControl->GetParent(), true);pControl->FindControl(__FindControlFromNameHash, this, UIFIND_ALL);return true;
}

  

  再之后在主窗口类OnCreate中

m_pm.AddNotifier(this);

  m_pm的m_aNotifiers成员加上主窗口类本身。

这样,点击按钮的时候,调用流程是 CButtonUI::Event--->CButtonUI::Activate()--->CButtonUI成员m_pManager的SendNotify

---->CPaintMangerUI成员m_aNotifier的Notify (也就包含主窗口类的Notify函数)

    for( int i = 0; i < m_aNotifiers.GetSize(); i++ ){static_cast<INotifyUI*>(m_aNotifiers[i])->Notify(Msg);}

  

疑惑:

CControlUI* pRoot = builder.Create(tstrSkin.c_str(), (UINT)0,  &cb, &m_pm);

  builder.Create中循环递归解析xml中的元素,最后调用:

CControlUI* CDialogBuilder::_Parse(CMarkupNode* pRoot, CControlUI* pParent, CPaintManagerUI* pManager)

  _Parse函数中,先是:

     // Init default attributesif( pManager ){pControl->SetManager(pManager, NULL, false);  //此处设置控件的CPaintManager

  最后又有:

        if( pManager ) {pControl->SetManager(NULL, NULL, false);}

  

ezhong的博客园:http://www.cnblogs.com/ezhong/

转载于:https://www.cnblogs.com/ezhong/archive/2011/11/15/2249894.html

关于duilib的按钮响应函数/C360SafeFrameWnd相关推荐

  1. duilib 自带树形控件的认识

    CTreeViewUI 1.该控件继承自CListUI,所以是使用了对应的列表来模拟树形控件.该控件的容器填装的是CTreeNodeUI,而CTreeNodeUI也继承CListContainerEl ...

  2. Android安卓程序消息提示和按钮响应事件

    首先在界面的XML里添加按钮响应函数 android:onClick="OnMyClick" <Buttonandroid:id="@+id/button1&quo ...

  3. 怎么把dll库写成MATLAB接口,如何在Matlab中应用动态连接库接口技术

    1 引言 Matlab是当前应用最为广泛的数学软件,具有强大的数值计算.数据分析处理.系统 分析.图形显示甚至符号运算等功能.利用这一完整的数学平台,用户可以快速实现十分 复杂的功能,极大地提高工程分 ...

  4. 记录一下集成修改触发模式的过程

    备注一下:修改的意义在于减少操作,修改触发模式的频率会影响操作速度.这样从四个控件改成两个,能够加快速度. 修改的一些目的见另一篇: 动态显示时采色改为单帧采色 修改之后,关于对触发模式,只剩下下面四 ...

  5. xcode 学习笔记2:动态添加view

    xcode 学习笔记2:动态添加view 2011-07-06 16:48:39|  分类: 计算机学习|字号 订阅 前面说的都是用的Interface Builder来编辑.xib文件来给窗口添加各 ...

  6. 【Android 逆向】IDA 工具使用 ( 函数窗口 Function window | 创建引用图 Xrefs graph to | 创建调用图 Xrefs graph from )

    文章目录 一.函数窗口 Function window 二.创建引用图 Xrefs graph to 三.创建调用图 Xrefs graph from 一.函数窗口 Function window 左 ...

  7. VC++对话框学习总结

    VC++中如何复制对话框资源 http://www.cnblogs.com/Yogurshine/p/3710566.html 法1: 在你的工程中添加另一个工程的rc文件,这时资源视图中就会出现两个 ...

  8. Matlab与C/C++混合编程接口及应用

    http://www.cnblogs.com/lidabo/archive/2012/08/24/2654148.html 在参考文献基础上.补充和完善了. Matlab与C/C++混合编程接口及应用 ...

  9. 无法执行添加/移除操作,因为代码元素**是只读的

    在vs中,大量添加窗体或者控件后,发现无法由系统IDE自动生成代码,如自动添加按钮响应函数等,rc管理器界面双击按钮添加函数,会出现 提示框 "无法执行添加/移除操作,因为代码元素**是只读 ...

最新文章

  1. thinkphp如何跨模块调用方法呢?
  2. odps结合mysql统计
  3. 程序调用mysql突然变慢_排查Mysql突然变慢
  4. JavaScript/JS的学习
  5. 南蛮图腾(洛谷P1498题题解,Java语言描述)
  6. 理解Linux中断 (3)【转】
  7. UTF8,Unicode 的区别(zt)
  8. 当你感到迷茫焦虑时,请听听白岩松这个演讲
  9. 两个类相互包含对方成员的问题(2)
  10. GitHub上最火的74个Android开源项目(三)
  11. 计网笔记(一) 什么是因特网
  12. 转载:bat批处理简易教程
  13. 【3D游戏模型】在ZBrush中制作3D兽人
  14. linux sed替换文件,linux的sed命令替换文件
  15. 4.1 使用常见的各种字体属性 [原创Excel教程]
  16. Java组各任务工作流程
  17. 贸然的对音乐版权进行维护,这种激进的方式将如何收场?
  18. 为什么使用LeakCanary检测内存泄漏?
  19. 怎么优化自己网站的关键词_新网站seo必做步骤
  20. BioNano生物纳米分子的“原始数据到完成装配和组装分析”管线与基于序列的基因组FASTA映射...

热门文章

  1. win10系统获取权限代码
  2. HCIA-GaussDB 华为认证数据库工程师(持续更新中60%)
  3. wdr5620千兆版虚拟服务器,TPLINK WDR5620千兆版与斐讯K2P对比评测
  4. Max23——3Dmax中,bone骨骼把左边的动画复制到右面的插件
  5. 余利华:网易大数据平台架构实践分享!
  6. 模仿天猫图片放大demo
  7. 搭建WebGIS网站
  8. 免费分享全套吴恩达深度学习课程笔记以及编程作业集合
  9. 解决老安卓系统根证书缺失或过期导致的网站访问错误及软件运行问题. 2023-03-05
  10. mdadm命令的基本使用