控制类(Controller)

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

成员函数PrintPos是用来在界面上显示当前鼠标所在位置,同时把最后鼠标位置保存起来。

成员函数MoveTo是用来当鼠标移动时,是否需要在窗口上显示直线,同时把当前鼠标位置显示到窗口。

在这个类里主要实现历史直线的显示、当前鼠标位置显示和移动时实时直线的显示。

控制类主要响应窗口所有事件,比如鼠标移动、按键按下、按键弹起、窗口更新等等。然后根据事件类型来调用模型类或视图类的功能。这个控制类的基类代码如下:

#开发人员:蔡军生(QQ:9073204) 深圳  2014-9-23
class Controller:
    def __init__(self):
        self.hWnd = HWND()
        self.msgfun = {
            WM_DESTROY:             self.OnDestroy,
            WM_PAINT:               self.OnPaint,
            WM_MOUSEMOVE:           self.OnMouseMove,
            WM_LBUTTONDOWN:         self.OnLButtonDown,
            WM_LBUTTONUP:           self.OnLButtonUp,
            WM_CAPTURECHANGED:      self.OnCaptureChanged,

            WM_NULL: self.OnNull #最后一个函数处理,方便在前面插入函数
            }        

    def SetWnd(self, hWnd):
        self.hWnd = hWnd
    def GetWnd(self):
        return self.hWnd
    def GetPoint(self, lParam):
        pt = POINT()
        pt.x = lParam & 0xFFFF
        pt.y = (lParam>>16) & 0xFFFF
        return pt
    def MyWndProc(self, hWnd, Msg, wParam, lParam):
        if Msg in self.msgfun and self.msgfun[Msg](wParam, lParam):
            return 0
        else:
            return windll.user32.DefWindowProcW(hWnd, Msg, wParam, lParam)
    def OnNull(self, wParam, lParam):
        pass
        return False
    def OnDestroy(self, wParam, lParam):
        windll.user32.PostQuitMessage(0)
        print(‘OnDestroy‘)
        return True
    def OnPaint(self, wParam, lParam):
        pass
        return False
    def OnMouseMove(self, wParam, lParam):
        pass
        return False
    def OnLButtonDown(self, wParam, lParam):
        pass
        return False
    def OnLButtonUp(self, wParam, lParam):
        pass
        return False
    def OnCaptureChanged(self, wParam, lParam):
        pass
        return False
时间: 2024-10-12 11:05:52

控制类(Controller)的相关文章

控制类(Controller)继承

在控制类里,Controller只是基类,主要实现从窗口传递过来的消息触发,并通过字典的方式来处理不同的消息响应.在Python里有字典,而没有case语句,对于很多消息来说,只有采用字典的方式会更容易处理消息调用函数.接收到一个消息时,可以先判断是否在字典里,如果存在说明这个消息已经有相应的响应函数,如果不存在说明这个消息给窗口的默认函数处理.通过字典的方式来处理,从代码的编写上来看,比case语句节省很多代码.你也许看到在这个基类里很多消息是没有明确的消息处理的,而只是填写pass语句,也就

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与

一个摄像机控制类的总结

一个摄像机控制类的总结 实现功能: 通过鼠标的操纵,控制摄像机环绕模型对象旋转,从而进行对模型对象的观察. 设计思路: 首先根据摄像机的当前方位,计算它应该到达的目标方位: 然后通过插值运算,将摄像机逐帧移动到该目标方位. 过程描述: 1. 计算摄像机的目标方位. 先计算摄像机本地坐标系轴向与世界坐标系轴向的夹角,作为方位的初始值.注意,这里只取摄像机需要旋转变化的坐标轴即可,这里我们用的是X和Y轴. 在鼠标的控制过程中,实时的修改此夹角值. 对修改后的夹角值进行限位处理,使之满足我们的需要.

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

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

UML 边界类、控制类、实体类

来源:http://bbs.csdn.net/topics/300192417 UML中类有三种主要的版型:边界类.控制类和实体类.引入边界类.控制类及实体类的概念有助于分析和设计人员确定系统中的类. 边界类位于系统与外界的交界处,窗体.报表.以及表示通讯协议的类.直接与外部设备交互的类.直接与外部系统交互的类等都是边界类.通过用例图可以确定需要的边界类,每个Actor/Use Case对至少要一个边界类,但并非每个Actor/Use Case对要唯一的边界类. 实体类保存要放进持久存储体的信息

【HLSDK系列】服务端实体 edict_t 和 控制类

我们来了解一下引擎是怎么管理实体的吧!我们这里就说说服务端的实体(edict_t) 服务端用 edict_t 这个结构体来保存一个实体,可以说一个 edict_t 就是一个 服务端实体,下文简称实体. 我们在 mp.dll 的源码里经常看到的那些 CBaseXXX 又和 edict_t 有什么关系呢? 引擎只管理小部分实体的功能,更多功能需要我们自己写代码去实现,这里就引入了 实体控制类 这个东西(就是那些 CBaseXXX),类就是C++的那个类.下文简称控制类. 接下来我们就分析 edict

高德地图的基础控制类

/** * @fileOverView 高德地图的基础控制类 * @author yi.z * @date 2014-02-19 */ var AMaper = function (config) { var me = this, mapObj = null, markerMap = {}, infoWindowMap = {}; /** * 初始化地图 * @param data.mapInner: 加载地图的div的id 默认为mapDiv * @param data.lng: 经度 * @

openstack部署安装(Icehouse版本)-控制节点(Controller)

控制节点(Controller)安装 此次安装,我们将数据库(mysql)安装到控制节点上,不为设置单独的数据库服务器. 2.1 安装数据库(mysql) # yum install mysql mysql-server MySQL-python -y 修改数据库的配置文件/etc/my.cnf,设置数据库的bing-address,数据库引擎,以及字符集等. [mysqld] ... bind-address = 10.0.0.11 default-storage-engine = innod

2.自定义元类控制类的创建行为

工作中,现有的类可能不能满足实际的个性化需求,那么我们需要自己定义元类来控制类的行为 本篇是对自定义元类控制类的创建行为的理解 自定义元类控制类型为分创建行为和实例化行为,其中控制创建行为是通过__Init__方法实现的. 1)我们知道,根据开发规范,类的名称是要大写的,但开发者不大写当然也可以运行的 2)开发者在创建类时,最好在类中加入一些注释,方便以后回头理解,也方便产品经理的理解,当然开发者不写这些注释也没关系 现在我要告诉你,类名必须大写!新建类必须要有注释!就是这么任性,哈哈 实现代码