控制類(Controller)繼承
來源:程序員人生 發布時間:2014-10-03 08:00:00 閱讀次數:1878次
在控制類里,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是鼠標左鍵彈起消息響應,這里比較簡單,只是取消鼠標捕捉。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈