MVC整个样例的源代码

以下就是整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()
时间: 2024-08-24 09:13:52

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

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

本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi) 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/cocos2d-html5/1528.html ? 点击订阅 ? 本博客最新动态!及时将最新博文通知您! Cocos2dx html5开发,对于用过2d Or -x的童鞋来说非常easy,Himi这里也没有必要去再跟同学们具体的教学一遍. 所以Himi简单做了一个项目,供给大家參考,源代码下载地址及GIF截图在文章

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

C# Winform程序的toolStrip中toolStripButton的背景是蓝色的,怎样改变背景及边框的颜色和样式呢? 实现此功能须要重写toolStripButton的Paint方法 这里仅仅是给出解决这个问题的思路和方法,例如以下图,当鼠标移到button上,背景会变为黑色 实现代码例如以下: ToolStripButton tsb = (ToolStripButton)sender; Rectangle rectButton = tsb.Bounds; Point p = tool

javaEE mvc样例具体解释

一个不错的样例值得细细品味: 以下依照包顺序将代码贴出来供大家參考: IEmpDAO package org.lzch.dao; import java.util.List; import org.lzch.vo.Emp; public interface IEmpDAO { public boolean doCreate(Emp emp)throws Exception; public boolean doUpdate(Emp emp)throws Exception; public bool

ADF Faces导出Excel文件【附样例工程】

本文提供一个基于ADF Face组件开发样例工程,工程的实现过程分为3个部分以应对Excel导出开发中常见的处理. 1.空模版文件下载:将Excel文件视为普通文件提供下载操作. 2.数据文件输出,将数据内容输出为Excel文件,目标文件尽在服务端内存中存在,这种方式需要对Excel文件的内容处理,需要引入响应的类库. 3.模版文件填充数据后下载,基于服务端的物理文件为模板,将业务数据填入约定位置后提供下载,在实现方面需要为工作簿对象指定源文件输入流,并完成后续内容处理. 实现的基本思路,由AD

基于Spring-SpringMVC-Mybatis的简单样例

复习下 好久没搞过撸过代码了! 这个样例包括一个完整的增删改查! 源代码地址http://download.csdn.net/detail/wangdianyong/8909903

关于peersim样例配置文件的超详细解读(新手勿喷)

相信很多兄弟一开始接触peersim,对配置文件还是有点不适应,我看了好久的样例的配置文件,一层层去找对应的文件的方法,终于好像悟懂了一点,记下来以后回顾. 贴上代码,一点点分析. 首先要说下所谓的配置文件,其实就是一个txt文件,语法也是非常简单,类似java里的给类里的变量赋值,这也正对应了配置文件的作用,配置文件,当然就是为实验的参数进行配置用的,所以配置文件的主要功能就是配置各类参数,定义一些协议类.控制类.初始化类以及一些常数. 1 # PEERSIM EXAMPLE 1 #配置文件中

zookeeper实战:SingleWorker代码样例

们需要一个“单点worker”系统,此系统来确保系统中定时任务在分布式环境中,任意时刻只有一个实例处于活跃:比如,生产环境中,有6台机器支撑一个应用,但是一个应用中有30个定时任务,这些任务有些必须被在“单线程”环境中运行(例如“数据统计”任务),避免并发的原因不是在java层面,可能是在操作db数据时,或者是在消息消费时,或者是信息推送时等.某个指标的“数据统计”任务,每天只需要执行一次,即使执行多次也是妄费,因为这种类型的定时任务,需要被“单点”.同时,如果一个任务在没有报告结果的情况下异常

学习OpenCV的学习笔记系列(二)源码编译及自带样例工程

下载及安装CMake3.0.1 要自己编译OpenCV2.4.9的源码,首先,必须下载编译工具,使用的比较多的编译工具是CMake. 下面摘录一段关于CMake的介绍: CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C 特性,类似UNIX下的automake.只是 CMake 的组态档取名为 CmakeLists.txt.Cmake 并不直接建构出最终的软件,而是产生标准

【实用】Dev C++编译器属性代码缺省源样例代码

这是我刚刚发明的东西,比较好用... 源代码复制到Dev C++编译器属性的代码缺省源内即可.. 用法: 包含常用头文件和ctime时间监控插件,常用缩写,快速读入,测试输出函数两个,读入函数,文件读入读出函数,work函数,主函数,还定义了所有的字母变量和常用的其他数组之类的变量.. 上手很快,功能强大..大家自己做一点补充吧.. 那些模板不想放进来,免得A+B都有好几K.. #include<iostream> #include<cstdlib> #include<cst