关于MFC监听器的相关了解
最近有个项目,所搭框架为了减少耦合,希望MainFrame中View不依赖于Mainframe,即MainFrame中含有view类而view中不会包含MainFrame的相关信息。
现在遇到一个问题,比如无论如何我们也会需要View在处理自己的相关内容时需要将一些信息告诉MainFrame,而我们又不希望View包含MainFrame的头信息,为了不导致两个文件的耦合,采用一种监听器的机制来实现该操作。
其想法是在View类中建立一个接口,使得View包含该接口指针的成员的变量;同时在MainFrame中将该接口进行实现,即创建由此接口派生出来的子类,将该子类的指针加到View中,这样在View进行先关操作时,可以发送一个消息给MainFrame的同时,又不会包含MainFrame的头文件,即达到了消息响应的功能,也不会导致两个不同层级类之间的耦合。具体实现如下:
在View类中,增加如下代码:
Class CMyView: public CView:
{
public:
// 创建接口
struct IListener
{
virtual void OnChange() = ;
} // MainFrame可以通过该函数在View中增加监听器的实例,以智能指针实现
void AddListener(std::shared_ptr<IListener> listener)
{
_listener = listener;
} private:
std::shared_ptr<IListener> _listener;
// 对监听器发出消息
void NotifyChange()
{
if(_listener)
{
_listener->OnChange();
}
}
}
在MainFrame中增加代码:
// 可以直接加在.cpp文件中
class CListenerForMyiView : public CMyView::IListener
{
public:
CListenerForMyView(CMainFrame& frame): _frame(frame) {}
virtual void OnChange()
{
_frame.OnChange();
} CMainFrame& _frame;
}; void CMainFrame::OnChange()
{
//具体实现
} void CMainFrame::AddListenerForView()
{
auto view = GetMyView();
ASSERT(view != nullptr);
//创建一个已存在view的监听器(这里目前只考虑只有一个view)
std::shared_ptr<CLintenerForMyView> listener(new CListenerForMyView(*this));
//调用View中的函数,确保正确加入监听器的实例
view->AddListener(listener);
}
这样只需要在view创建之后,MainFrame调用AddListenerForView就可以创建一个可以监听的实例。
关于MFC监听器的相关了解的更多相关文章
- listener监听器的相关知识
从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...
- MFC中线程相关知识
MFC中把线程分为两种类型,UI线程和工作者线程. MFC中启动一个线程的最好方法是调用AfxBeginThread,有两个版本,一个用于启动Ui线程,另外一个用于启动工作者线程.在MFC程序中,只有 ...
- 【Servlet】1、Servlet监听器及相关接口
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前.发生后可以做一些必要的处理. 接口: 目前Servlet2.4和JSP2.0总共有8个监听器接口和6个Event类,其中Ht ...
- 64位电脑上安装MySQL进行MFC开发的相关问题
本人环境: 64位win7 + MySQL5.6 安装MySQL的时候有个选项是 选择:32位/64位.默认情况下是安装当前操作系统的位数.但我在使用VS进行开发的时候发现问题: error LNK2 ...
- MFC 状态栏相关使用(CStatusBar & CStatusBarCtrl)
原文:MFC 状态栏相关使用(CStatusBar & CStatusBarCtrl),沙漠紫风铃 本文介绍了MFC中和状态栏相关的用法: 在MFC的的单文档应用中,在建好应用程序之后,CMa ...
- MFC界面相关源码
这是这4篇MFC界面的相关源码.建议学习Visual C++的看看这2本微软官方出的教材. [MFC Windows程序设计(第2版,修订版)](美)Jeff Prosise著 [Windows程序设 ...
- Servlet使用注解标注监听器(Listener)
Servlet3.0提供@WebListener注解将一个实现了特定监听器接口的类定义为监听器,这样我们在web应用中使用监听器时,也不再需要在web.xml文件中配置监听器的相关描述信息了. 下面我 ...
- uiautomator-----UiWatcher监听器
一.UiWatcher类说明 1.Uiwatcher用于处理脚本执行过程中遇到非预想的步骤 2.UiWatcher使用场景 1)测试过程中来了一个电话 2)测试过程中来了一条短信 3)测试过程中闹钟响 ...
- [MFC] 梳理一个简单的图片处理桌面软件中用到的MFC控件技巧
前言 前些天应好友之拖,帮忙设计一个简单的图像处理的小软件.朋友把核心算法封装好了,但是是用openCV类似于console的编程环境,要我在此基础上改成MFC桌面程序.下图是做成之后的效果: 我是 ...
随机推荐
- Memcached在windows下的安装于使用
原文链接:http://blog.csdn.net/jjmaiz/article/details/7935672 有一点要注意的是,上文作者没有提及: 将php_memcached.dll放在ext文 ...
- Android打电话&发短信
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView ...
- ajax遍历数组(实现百度搜索提示的效果)
方法一: 页面 <input type="hidden" id="classpath" value="${pageContext.request ...
- OGNL和Struts2标签
OGNL和Struts2标签 你使用过的OGNL 页面获取并输出Action属性<s:property value="userName"/> 页面中获取request保 ...
- vssver2.scc 文件是干啥的?
idcdpi源文件下的tools下有一个文件 vssver2.scc vssver2.scc是什么文件 首先,先来个名词解释:Microsoft Visual Source Safe是美 ...
- .net 的一个分词系统(jieba中文分词的.NET版本:jieba.NET)
简介 平时经常用Python写些小程序.在做文本分析相关的事情时免不了进行中文分词,于是就遇到了用Python实现的结巴中文分词.jieba使用起来非常简单,同时分词的结果也令人印象深刻,有兴趣的可以 ...
- DOM: 如何获取元素下的第一个子元素
Element.firstChild ?,是的,这是第一种方法,当然,通常来说支持 W3C 规范的浏览器,如 Firefox 等取到的应该是 TEXT_NODE.很早之前,或者说现在最流行的方法可能是 ...
- git初学者这样就行了。
Create a new repository on the command line touch README.md git init git add README.md git commit -m ...
- 最近win7更新后出现第二次打开IDE(delphi2007)的时候提示无法打开"EditorLineEnds.ttr"这个文件
kb2982791 - 2014年8月12日更新 - http://support.microsoft.com/kb/2982791kb2970228 - 2014年8月12日更新 - http:// ...
- How to install OpenResty
How to install OpenResty 15 January 2014, 6:18 am OpenResty, also called “ngx_openresty”, is a web ...