视类主要用来向界面显示内容用的,与显示无前的内容都不会放到这里。在本例子里,主要用来向窗口画直线和在窗口固定位置显示当前鼠标所在位置。在Windows的画直线,就是调用它的API函数LineTo来实现,显示字符串使用API函数TextOut。为了方便使用,在这里都对这些部件进行封装,抽像成好用的类,这样使用起来不用担心句柄资源泄漏。一年之前,在公司里有一个新同事进来,刚开始写界面的代码,为了给界面绘图添加一种颜色,就创建了一个画笔,但奇怪的就在这里,他创建之后,从来不删除,结果这个软件在他那里测试几次,几十次都没有问题。但在测试组那里,经历了一个星期的测试,突然发现电脑的界面不能动了,像中病毒一样,我一直在找问题,一打开系统管理器查看,发现居然占用这么多句柄,肯定是在某个地方触发这段代码的运行,导致句柄超出了系统管理范围。不过问题是发现了,但要在50多万行代码里查找出这个问题,非常困难。最后只能几个人审查所有界面代码,然后针对一些界面句柄添加统计,查看是否释放掉。经历好几天,总算把它确定了位置,作出修改之后再测试一周,没有发现相应的问题。因此,这里使用类的构造和析构函数进行资源的自动管理是一个非常棒的方法。视图类的代码如下:
#视图类 class View: def __init__(self): self.x = 0 self.y = 0 def Paint(self, canvas, ptList): pen = Pen(0, 0, canvas.RGB(255, 0, 0)) penhold = Holder(canvas.Gethdc(), pen.Gethpe()) self.PrintPos(canvas, self.x, self.y) for pt in ptList: if pt[2]: canvas.MoveTo(pt[0], pt[1]) else: canvas.LineTo(pt[0], pt[1]) def PrintPos(self, canvas, x, y): self.x = x self.y = y strOut = u'Mouse: %04d, %04d' % (x, y) canvas.Text(0, 0, strOut) def MoveTo(self, canvas, x, y, isVisible): if isVisible: pen = Pen(0, 0, canvas.RGB(255, 0, 0)) penhold = Holder(canvas.Gethdc(), pen.Gethpe()) canvas.Line(self.x, self.y, x, y) self.PrintPos(canvas, x, y)