在这个视图类里,由构造函数声明了两个保存当前鼠标坐标的点(x, y)。接着下来看到成员函数Paint,这个函数主要作用就是把界面所有画过的线,在窗口更新之后,再次把所有的直线显示出来。所以在这个函数传入两个参数:canvas和ptList,canvas是窗口的画布,ptList是保存所有直线的端点,有了画布和所有直线的端点,就可以把以前在界面画过的线重新显示出来。为什么要这样做呢?因为窗口每次更新,都会变成一个空白的画布,如果不把以前的直线显示出来,界面上就什么也看不到。
成员函数PrintPos是用来在界面上显示当前鼠标所在位置,同时把最后鼠标位置保存起来。
成员函数MoveTo是用来当鼠标移动时,是否需要在窗口上显示直线,同时把当前鼠标位置显示到窗口。
在这个类里主要实现历史直线的显示、当前鼠标位置显示和移动时实时直线的显示。
控制类(Controller)
控制类主要响应窗口所有事件,比如鼠标移动、按键按下、按键弹起、窗口更新等等。然后根据事件类型来调用模型类或视图类的功能。这个控制类的基类代码如下:
#开发人员:蔡军生(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