以下就是整MVC样例的源代码:

#windows应用程序
#开发者:蔡军生(QQ:9073204) 深圳 2014-9-24
#使用类来描写叙述
from ctypes import *
from ctypes.wintypes import * WS_EX_APPWINDOW = 0x40000
WS_OVERLAPPEDWINDOW = 0xcf0000
WS_CAPTION = 0xc00000
SW_SHOWNORMAL = 1
SW_SHOW = 5
CS_HREDRAW = 2
CS_VREDRAW = 1
CW_USEDEFAULT = 0x80000000 MK_LBUTTON = 0x0001
MK_RBUTTON = 0x0002
MK_SHIFT = 0x0004
MK_CONTROL = 0x0008
MK_MBUTTON = 0x0010 WM_NULL = 0
WM_DESTROY = 2
WM_NCCREATE = 0x0081
WM_PAINT = 0x000F
WM_MOUSEMOVE = 0x0200
WM_LBUTTONDOWN = 0x0201
WM_LBUTTONUP = 0x0202
WM_CAPTURECHANGED = 0x0215 WHITE_BRUSH = 0
GWL_USERDATA = -21
IDC_ARROW = 32512 WNDPROCTYPE = WINFUNCTYPE(c_int, HWND, c_uint, WPARAM, LPARAM)
#定义窗体类结构
class WNDCLASSEX(Structure):
_fields_ = [("cbSize", c_uint),
("style", c_uint),
("lpfnWndProc", WNDPROCTYPE),
("cbClsExtra", c_int),
("cbWndExtra", c_int),
("hInstance", HANDLE),
("hIcon", HANDLE),
("hCursor", HANDLE),
("hBrush", HANDLE),
("lpszMenuName", LPCWSTR),
("lpszClassName", LPCWSTR),
("hIconSm", HANDLE)] #定义创建窗体的參数结构
class CREATESTRUCTW(Structure):
_fields_ = [("lpCreateParams", LPVOID),
("hInstance", HANDLE),
("hMenu", HMENU),
("hwndParent", HWND),
("cy", c_int),
("cx", c_int),
("y", c_int),
("x", c_int),
("style", LONG),
("lpszName", LPCWSTR),
("lpszClass", LPCWSTR),
("dwExStyle", DWORD)] #定义窗体画图结构
class PAINTSTRUCT(Structure):
_fields_ = [('hdc', c_int),
('fErase', c_int),
('rcPaint', RECT),
('fRestore', c_int),
('fIncUpdate', c_int),
('rgbReserved', c_wchar * 32)] #窗体类
class Window:
def __init__(self, hWnd):
self.hWnd = hWnd
def Display(self, cmdShow):
windll.user32.ShowWindow(self.hWnd, cmdShow)
windll.user32.UpdateWindow(self.hWnd)
def CaptureMouse(self):
windll.user32.SetCapture(self.hWnd)
def ReleaseMouse(self):
windll.user32.ReleaseCapture()
def HasCapture(self):
return False
def IsCtrl(self, wParam):
return (wParam & MK_CONTROL) != 0
def IsShift(self, wParam):
return (wParam & MK_SHIFT) != 0
def IsLButton(self, wParam):
return (wParam & MK_LBUTTON) != 0
def IsMButton(self, wParam):
return (wParam & MK_MBUTTON) != 0
def IsRButton(self, wParam):
return (wParam & MK_RBUTTON) != 0 #窗体类型注冊类
class WinClassMaker:
def __init__(self, wndProc, className, hInst):
self.wndClass = WNDCLASSEX()
self.wndClass.cbSize = sizeof(WNDCLASSEX)
self.wndClass.style = CS_HREDRAW | CS_VREDRAW
self.wndClass.lpfnWndProc = wndProc
self.wndClass.cbClsExtra = 0
self.wndClass.cbWndExtra = 0
self.wndClass.hInstance = hInst
self.wndClass.hIcon = 0
self.wndClass.hCursor = windll.user32.LoadCursorW(0, IDC_ARROW)
self.wndClass.hBrush = windll.gdi32.GetStockObject(WHITE_BRUSH)
self.wndClass.lpszMenuName = 0
self.wndClass.lpszClassName = className
self.wndClass.hIconSm = 0
def Register(self):
return windll.user32.RegisterClassExW(byref(self.wndClass)) #创建窗体
class WinMaker:
def __init__(self, className, hInst):
self.className = className
self.hInst = hInst
self.style = WS_OVERLAPPEDWINDOW | WS_CAPTION
self.exStyle = 0
self.x = CW_USEDEFAULT
self.y = 0
self.width = CW_USEDEFAULT
self.height = 0
self.hWndParent = HWND(0)
self.hMenu = HWND(0)
self.wndCreatData = c_void_p(0)
def Create(self, wndCreatData, title):
self.hWnd = windll.user32.CreateWindowExW(
self.exStyle, self.className, title,
self.style,
self.x, self.y,
self.width, self.height,
self.hWndParent,
self.hMenu,
self.hInst,
py_object(wndCreatData)) if not self.hWnd:
print('Failed to create window')
exit(0)
return self.hWnd 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 #窗体消息处理回调函数
def PyWndProc(hWnd, Msg, wParam, lParam):
pyCtrl = windll.user32.GetWindowLongW(hWnd, GWL_USERDATA)
if Msg == WM_NCCREATE:
creatstructw = cast(lParam, POINTER(CREATESTRUCTW)).contents
pyCtrl = creatstructw.lpCreateParams
windll.user32.SetWindowLongW(hWnd, GWL_USERDATA, pyCtrl) #获取控制类对象
ctrl = cast(pyCtrl, py_object).value
ctrl.SetWnd(hWnd) if pyCtrl:
#获取控制类对象
ctrl = cast(pyCtrl, py_object).value
return ctrl.MyWndProc(hWnd, Msg, wParam, lParam)
else:
return windll.user32.DefWindowProcW(hWnd, Msg, wParam, lParam) #画布
class Canvas:
def __init__(self, hdc):
self.hdc = hdc
def Gethdc(self):
return self.hdc
def SetPixel(self, x, y, color):
windll.gdi32.SetPixel(self.hdc, x, y, color)
def MoveTo(self, x, y):
windll.gdi32.MoveToEx(self.hdc, x, y, 0)
def LineTo(self, x, y):
windll.gdi32.LineTo(self.hdc, x, y)
def Line(self, x1, y1, x2, y2):
windll.gdi32.MoveToEx(self.hdc, x1, y1, 0)
windll.gdi32.LineTo(self.hdc, x2, y2)
def Text(self, x, y, text):
windll.gdi32.TextOutW(self.hdc ,x, y, text, len(text))
def RGB(self, r, g, b):
r = r & 0xFF
g = g & 0xFF
b = b & 0xFF
return (b << 16) | (g << 8) | r
class PaintCanvas(Canvas):
"""用于OnPaint消息处理"""
def __init__(self, hWnd):
self.hWnd = hWnd
self.paint = PAINTSTRUCT() hdc = windll.user32.BeginPaint(self.hWnd, byref(self.paint))
Canvas.__init__(self, hdc)
def __del__(self):
windll.user32.EndPaint(self.hWnd, byref(self.paint))
class UpdateCanvas(Canvas):
"""用于更新窗体"""
def __init__(self, hWnd):
hdc = windll.user32.GetDC(hWnd)
Canvas.__init__(self, hdc)
self.hWnd = hWnd
def __del__(self):
windll.user32.ReleaseDC(self.hWnd, self.hdc) #画笔
class Pen:
def __init__(self, penstyle, width, color):
self.hpe = windll.gdi32.CreatePen(penstyle, width, color)
def __del__(self):
windll.gdi32.DeleteObject(self.hpe)
def Gethpe(self):
return self.hpe
class Holder:
def __init__(self, hdc, hobj):
self.hdc = hdc
self.old = windll.gdi32.SelectObject(hdc, hobj)
def __del__(self):
windll.gdi32.SelectObject(self.hdc, self.old)
#MVC类
#模型类
class Model:
def __init__(self):
self.ptList = []
self.maxList = 2000
def AddPoint(self, x, y, isStart):
if len(self.ptList) > self.maxList:
self.ptList.remove(0)
#以元组的方式保存到列表
self.ptList.append((x,y,isStart))
def GetPoint(self):
return self.ptList
#视图类
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)
#控制类
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
#主函数入口
def main():
#程序实例句柄
hInst = windll.kernel32.GetModuleHandleW(None)
WndProc = WNDPROCTYPE(PyWndProc) #窗体类名称
className = u'ShenzhenCai'
#窗体标题
wname = u'MVC' #创建窗体类型
winClass = WinClassMaker(WndProc, className, hInst)
winClass.Register() #构造窗体对象
maker = WinMaker(className, hInst)
#控制类
ctrl = CtrlAll()
#创建窗体
win = Window(maker.Create(ctrl, wname))
#创建显示
win.Display(SW_SHOW) #消息循环
msg = MSG()
lpmsg = pointer(msg)
print('Entering message loop')
while windll.user32.GetMessageW(lpmsg, 0, 0, 0) != 0:
windll.user32.TranslateMessage(lpmsg)
windll.user32.DispatchMessageW(lpmsg) print('done.') if __name__ == "__main__":
print( "Win32 Application in python" )
main()

MVC整个样例的源代码的更多相关文章

  1. Spring MVC使用样例

    Spring MVC使用样例 步骤1:添加Spring的相关依赖 1 <dependency> 2 3 <groupId>com.alibaba.external</gr ...

  2. Android中MVP模式与MVC模式比較(含演示样例)

    原文链接 http://sparkyuan.me/ 转载请注明出处 MVP 介绍 MVP模式(Model-View-Presenter)是MVC模式的一个衍生. 主要目的是为了解耦,使项目易于维护. ...

  3. hadoop学习;block数据块;mapreduce实现样例;UnsupportedClassVersionError异常;关联项目源代码

    对于开源的东东,尤其是刚出来不久,我认为最好的学习方式就是能够看源代码和doc,測试它的样例 为了方便查看源代码,关联导入源代码的项目 先前的项目导入源代码是关联了源代码文件 block数据块,在配置 ...

  4. c#Winform程序的toolStripButton自己定义背景应用演示样例源代码

    C# Winform程序的toolStrip中toolStripButton的背景是蓝色的,怎样改变背景及边框的颜色和样式呢? 实现此功能须要重写toolStripButton的Paint方法 这里仅 ...

  5. 【COCOS2D-HTML5 开发之三】演示样例项目附源代码及执行的GIF效果图

    本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2d- ...

  6. obj-c编程15[Cocoa实例03]:MVC以及归档化演示样例

    前面的博文里介绍了归档和解档,这里我们把它实际应用到一个简单的代码中去,将它作为一个多文档应用程序的打开和保存的背后支持.另外这里介绍一下MVC思想,这个在不论什么语言里都会有,它是一种设计思想,主要 ...

  7. Libcurl的编译_HTTP/HTTPSclient源代码演示样例

    HTTP/HTTPSclient源代码演示样例 环境:  zlib-1.2.8  openssl-1.0.1g  curl-7.36 Author:  Kagula LastUpdateDate: 2 ...

  8. 源代码方式向openssl中加入新算法完整具体步骤(演示样例:摘要算法SM3)【非engine方式】

    openssl简单介绍 openssl是一个功能丰富且自包括的开源安全工具箱.它提供的主要功能有:SSL协议实现(包括SSLv2.SSLv3和TLSv1).大量软算法(对称/非对称/摘要).大数运算. ...

  9. Thrift源代码分析(八)--总结加一个完整的可执行的Thrift样例

    前面七篇文章分析了Thrfit的方方面面,看到这里时应该对Thrift有了深入的理解. Thrift源代码分析(一)-- 基本概念 Thrift源代码分析(二)-- 协议和编解码 Thrift源代码分 ...

随机推荐

  1. [转载]各种在线api地址

    J2SE1.7英文api地址: http://download.oracle.com/javase/7/docs/api/J2SE1.6英文api地址:  http://download.oracle ...

  2. vs linq to db template

    linq to db template 支持sqlite. mysql .db2. accress. oracle. Firebird等多种数据库以linq方式操作数据. NuGet NuGet 是 ...

  3. 偶然碰到的Win7 64位下CHM 的问题解决

    最近下了几个沪江资料,都是chm格式的,但是在win7 64位下,都显示不了里面的音频和视频flash之类的控件,虽然可以通过源文件的方式打开视频文件,但是很麻烦.    网上似乎碰到的人也不是很多, ...

  4. 自动分组+合并完整的sql脚本

    BEGIN#前提:指定字符串长度为8字符定长#逻辑:循环8次,比对2个字符串相同索引位置下的数值大小,并取结果最大值.#示例:merge1(输入参数source1,输入参数source2,输出结果re ...

  5. git和GItHub的区别

    git是一个版本控制工具.github是一个用git做版本控制的项目托管平台. 这有点类似于Wordpress和Wordpress.com的关系,前者是一个任何人都可以用的免费博客系统,后者是一个平台 ...

  6. C++对C语言的非面向对象特性扩充(3)

    今天要讲的是C++作用域运算符"::",强制类型转换的扩充,C++中相对于C中malloc和free函数的运算符new和delete,以及C++对C的一个重要扩充:引用(refer ...

  7. JavaSE学习总结第11天_开发工具 & API常用对象1

      11.01 常见开发工具介绍 1:操作系统自带的记事本软件 2:高级记事本软件例:Editplus,Notepad++,UltraEdit 3:集成开发环境 IDE(Integrated Deve ...

  8. {% load staticfiles %}

    原先写法 {# <link rel="stylesheet" href="/static/css/reset.css"/>#} 不使用路径写法,方便 ...

  9. JS实现常用的分享到按钮

    我们阅读博客的时候经常会用到这样功能,当然有时候也会想把自己的网站上也加入类似的分享功能,各大厂商已经给出了相应的API,点击一个按钮即可弹出窗口进入分享,我们事先可以设置一些参数,一般常用的就是 网 ...

  10. QComboBox 添加图片(自带addItem函数就有这个功能,从没有注意过)

    方法:    使用 QComboxBox::addItem(QIcon, QString); 示例: 点击(此处)折叠或打开 QComboBox *combo_status = new QComboB ...