在控制类里,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是鼠标左键弹起消息响应,这里比较简单,只是取消鼠标捕捉。