控制类(Controller)继承

在控制类里,Controller只是基类,主要实现从窗口传递过来的消息触发,并通过字典的方式来处理不同的消息响应。在Python里有字典,而没有case语句,对于很多消息来说,只有采用字典的方式会更容易处理消息调用函数。接收到一个消息时,可以先判断是否在字典里,如果存在说明这个消息已经有相应的响应函数,如果不存在说明这个消息给窗口的默认函数处理。通过字典的方式来处理,从代码的编写上来看,比case语句节省很多代码。你也许看到在这个基类里很多消息是没有明确的消息处理的,而只是填写pass语句,也就是说这些函数什么功能也没有做,只是一个占位的作用。这样写有什么意义呢?其实这样写是相当于C++里的虚函数,只要派生类里重载这些函数,实现相应功能就可以调用。这样设计的意图就是想让控制类在不同场合下使用时编写不同的功能代码,从而达到基类的代码复用。派生类的实现具体的消息处理,代码如下:

#开发人员:蔡军生(QQ:9073204) 深圳  2014-9-24
#控制类
class CtrlAll(Controller):
    def __init__(self):
        Controller.__init__(self) #调用基类构造方法

        self.model = Model()
        self.view = View()
        self.win =  Window(self.GetWnd())

    def OnPaint(self, wParam, lParam):
        paint = PaintCanvas(self.GetWnd())
        self.view.Paint(paint, self.model.GetPoint())
        return True
    def OnMouseMove(self, wParam, lParam):
        paint = UpdateCanvas(self.GetWnd())
        pt = self.GetPoint(lParam)

        if self.win.IsLButton(wParam):
            self.model.AddPoint(pt.x, pt.y, False)
            self.view.MoveTo(paint, pt.x, pt.y, True)
        else:
            self.view.PrintPos(paint, pt.x, pt.y)
        return True
    def OnLButtonDown(self, wParam, lParam):
        self.win.CaptureMouse()
        paint = UpdateCanvas(self.GetWnd())
        pt = self.GetPoint(lParam)
        self.view.MoveTo(paint, pt.x, pt.y, False)

        self.model.AddPoint(pt.x, pt.y, True)
        return True
    def OnLButtonUp(self, wParam, lParam):
        self.win.ReleaseMouse()
        return True  

在派生类的构造函数里先调用基类的构造函数进行初始化,接着创建模型类和视图类,这样控制类就可以与模型类和视图类进行沟通了。

成员函数OnPaint是响应窗口界面更新的消息,因此调用视图类里更新窗口界面。

成员函数OnMouseMove是当鼠标移动时响应,这里调用模型类来保存相应的数据,并调用视图类在界面上显示相应的鼠标的坐标。

成员函数OnLButtonDown是鼠标左键按下消息响应,在这里先捕捉鼠标,然后获取鼠标的坐标,接着在界面显示鼠标当前位置,最后把相应的鼠标坐标位置保存到模型类里。

成员函数OnLButtonUp是鼠标左键弹起消息响应,这里比较简单,只是取消鼠标捕捉。

时间: 2024-09-28 16:09:57

控制类(Controller)继承的相关文章

通过元类来控制类的产生

通过元类来控制类的产生 自定义元素:来控制类的产生,可以控制类名,可以控制类的继承父类,控制类的名称空间 自定义元类必须继承type,写一个类继承type 这种类都叫元类 class Mymeta(type): # def __init__(self,*args,**kwargs): def __init__(self,name,bases,dic): # self 就是Person类 print(name) print(bases) print(dic) #练习一:加限制 控制类名必须以sb开

控制类(Controller)

在这个视图类里,由构造函数声明了两个保存当前鼠标坐标的点(x, y).接着下来看到成员函数Paint,这个函数主要作用就是把界面所有画过的线,在窗口更新之后,再次把所有的直线显示出来.所以在这个函数传入两个参数:canvas和ptList,canvas是窗口的画布,ptList是保存所有直线的端点,有了画布和所有直线的端点,就可以把以前在界面画过的线重新显示出来.为什么要这样做呢?因为窗口每次更新,都会变成一个空白的画布,如果不把以前的直线显示出来,界面上就什么也看不到. 成员函数PrintPo

Java类的继承与权限控制

1.继承:***是一种****,说明是继承关系 Java中使用extends关键字实现类的继承机制,语法规则: 通过继承,子类拥有基类(superclass/父类)的所有成员(成员变量和成员方法) Java只支持单继承,不允许多继承 一个子类只能有一个基类,一个基类可以派生出多个子类  2.访问控制

cocos2d-x 源码分析 : control 源码分析 ( 控制类组件 controlButton)

源码版本来自3.1rc 转载请注明 cocos2d-x源码分析总目录 http://blog.csdn.net/u011225840/article/details/31743129 1.继承结构 control的设计整体感觉挺美的,在父类control定义了整个控制事件的基础以及管理,虽然其继承了Layer,但其本身和UI组件的实现并没有关联.在子类(controlButton,controlSwitch,controlStepper等中实现不同的UI组件).下面通过源码来分析control与

【Unity】常用脚本类的继承关系(入门篇)

前言 学习Unity开发引擎的初学者会接触大量的脚本类,而这些类之间的关系往往容易被忽略. 本文对Unity引擎开发中的一些常用类及其关系进行了简单的归纳总结. 博文首发地址:http://blog.csdn.net/duzixi Unity常用脚本类继承关系图 对Unity开发稍有了解的朋友都知道,在Unity开发框架中有4个基本层次:工程(应用程序).场景.游戏对象和组件. 在脚本中,整个应用程序和场景由Application类控制:而游戏对象和组件类均继承于Object类. 在Object

[ionic开源项目教程] - 第11讲 封装BaseController实现controller继承

关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程. 截止到第10讲,tab1[健康]模块的功能基本已经完成了,但这一讲中,controller层又做了较大的改动,因为下一讲中tab2[医疗]模块的实现跟tab1类似,考虑到不让代码冗余,这里使用BaseCtrl将公共代码提取出来作为controller的基类,供其它模块使用,提取后的[健康]模块也对应有所改动. 目录 [ionic开源项目教程] 第1讲 前言,技术储备,环境搭建,常用命令 [ionic开源项目教程] 第2讲

WebRTCDemo.apk代码走读(九):VoiceEngine和VideoEngine主要的控制类说明

转载注明出处http://blog.csdn.net/wanghorse 1. VideoEngineImpl VideoEngine对外提供的集成接口实现类, 其继承了VideoEngine对外提供的所有接口实现类,包括 ViEBaseImpl/ViECaptureImpl/ViEFileImpl/ViEImageProcessImpl/ViENetworkImpl/ViERTP_RTCPImpl/ViEExternalCodecImpl/VideoEngine 2. ViEBaseImpl

C++ 类的继承

在C++中,可重用性是通过继承这一机制来实现的,因此,继承是C++中一个重要的部分. 1.派生类的声明 声明一个派生类的一般格式为: class 派生类名:继承方式  基类名 {     //派生类新增的数据成员和成员函数 }; 从已有类派生出新类时,可以在派生类内完成以下功能: (1)可以增加新的数据成员 (2)可以增加新的成员函数 (3)可以对基类的成员进行重定义 (4)可以改变基类成员在派生类中的访问属性 2.基类成员在派生类中的访问属性 从基类继承来的成员在派生类中的访问属性是由继承方式

C++ Primer 学习笔记_71_面向对象编程 --句柄类与继承

面向对象编程 --句柄类与继承 引言: C++中面向对象编程的一个颇具讽刺意味的地方是:不能使用对象支持面向对象编程,相反,必须使用指针或引用. void get_prices(Item_base object, Item_base *pointer, Item_base &reference){ //需要根据指针或引用实际所绑定的类型进行调用 cout<< pointer ->net_price(1)<< endl; cout<< reference.n