一个蒙皮的对话框在Python和MFC

介绍 通过遵循MVC,您可以创建漂亮的皮肤的ui和编写程序的逻辑部分很容易在Python中。 背景 当我第一次想到这个程序中,我使用tkinter python。但是很难让一个美丽的窗口使用tkinter。使用tkinter更像在Java中使用Swing。那时候,我不是很熟悉Python。所以我决定做一个MFC剥皮UI与python。这是大约7年前。我离开后一个小应用程序,代码在我的硬盘。最近,我使用dropbox和我意识到dropbox在python中。这段代码的dropbox提醒我。所以我在CodeProject上张贴在这里。我不确定它可能帮助那些想喜欢我,但我希望如此。 使用的代码 这个程序由三部分组成:XML脚本的皮肤,实际上的Python脚本执行程序,MFC DLL用于创建一个剥了皮的对话框,并把用户操作的Python脚本。 皮肤:的XML脚本隐藏,收缩,复制Code< ?xml version = " 1.0 " ?比; & lt; brandnewui> & lt; info> 信息关于这个皮肤… & lt; / info> & lt; resource> & lt;位图id =“bmp文件”=“HelloWorld.bmp”/比; 资源…… & lt;图标id = =“HelloWorld.ico”/“图标”文件比; & lt; / resource> & lt;窗口id =“hello”类型=“cwnd”比; & lt;位置x = " 150 " y = =“292”“150”宽度高度= " 171 " /比; & lt;背景颜色= " 0 x00000 " /比; & lt; id =“图标”图标/比; & lt;地区/比; & lt; alwaystop /比; & lt;磁/比; & lt;不透明度值= " 80 " /比; & lt;移动x = " 0 " y = " 0 "宽度= " 292 "高度= " 25 " /比; 实际控制的位置和属性…… & lt; emcontrol id =“bg”类型=“图片”比; & lt;位置x = " 0 " y = " 0 "宽度= " 292 "高度= " 171 " /比; & lt;背景id =“bmp /比; & lt;地区/比; & lt; / emcontrol> & lt; emcontrol id =“hello”类型=“静态”比; & lt;位置x = 40 y = " 60 "宽度= =“37”/“144”高度比; & lt;背景id = " bmp_bg " /比; & lt;背景值= " ECE9D8 " /比; & lt;输入textcolor value = " 000000 " /比; & lt;字体类型=“系统”大小= " 30 "对齐=“正确”的大胆= " true " /比; & lt;文本值=“Hello World”/比; & lt; / emcontrol> & lt; / window> & lt; / brandnewui> XML皮肤是直观的和不需要描述。你应该记住的事情是窗口标签和窗口ID,因为Python脚本将发送一个消息给窗口使用ID属性窗口的标识符。 Python脚本:隐藏,收缩,复制代码# #导入模块 进口win32api win32con win32gui 进口win32ui 进口win32con 进口的字符串 从ctypes进口* 从BrandNewUI进口* # #皮肤窗口消息的过程 def SkinWndProc (str): 运算符= string.split (str.value,“/”) # #压了 如果运营商[0]= =“btn_close”: HelloWorld.SendSkinMessage(“wndmgr”、“cls”、“你好”) HelloWorld.FinalSkin () EndPumpMessage () 通过 HelloWorld = CBrandNewUI(”。 BrandNewUI.dll”、“ HelloWorld HelloWorld.xml。”) HelloWorld.LoadModule () HelloWorld.InitSkin () HelloWorld.SetAppHwnd () HelloWorld.GetSkinMessage () HelloWorld.SendSkinMessage(“wndmgr”、“opn”、“你好”) HelloWorld.SetSkinProc (SkinWndProc) StartPumpMessage () LoadModule是MFC DLL加载。InitSkin阅读XML皮肤文件,解析该文件。SetAppHwnd是Python窗口和MFC窗口之间的交流。他们应该知道彼此发送消息。SendSkinMessage是传递一个消息给MFC DLL模块。在这个例子中,wndmgr是一个缩写“窗口管理器”。这是一个命令打开(opn)一个窗口(“hello”),应该在XML的窗口管理器是相同的。opn的反面是cls(“关闭”)。 MFC模块的API descriptionThis由python模块与窗口。因为它通过窗口发送消息SendMessage字符串指针。Python脚本将接收和解析字符串的字符串消息。API的功能包括: 隐藏,复制Code_Initialize _Finalize _SendSkinMessage _SetAppHWND _GetSkinMessage _GetLastRespond _GetLastError _GetSkinInfo _UnzipSkinFile 这些函数是Python脚本api。Python脚本能够调用这些api通过使用win32api, win32con win32gui。请参阅BrandNewUI.py(这是陈词滥调了名字:-()文件显示了如何加载DLL的窗口和调用它。我也使用这些外部代码: CWebpage:网络控制引用:http://www.codeproject.com/KB/COM/cwebpage.aspx?味精= 2804355外籍人士:XML解析器库:http://expat.sourceforge.net/ 点iInterest 与py2exe包 您可以创建一个与py2exe exe文件。首先你必须准备脚本就像下图: 隐藏,复制Code

# setup.py
from distutils.core import setup
import py2exe

setup(windows=["Calculator.py"])

创建脚本后,运行“python设置。py2exe”在控制台中。然后将dll和皮肤文件夹复制到运行py2exe时创建的dist文件夹中。这些是运行时需要的独立>libexpat。dll, mfc71。dll, msvcp71。dll, msvcr71.dll。最后,您可以在dist文件夹中启动一个独立的exe文件。下面是py2exe站点链接:http://www.py2exe.org/index.cgi/Tutorial。 发送c-string msg到python ctypes模块帮助我将CSstring指针类型转换为Python字符串。 隐藏,复制Code

//MFC msg string is like this
m_strAppMessage.Format("%s/%s/%s/%d", lpszID , lpszAction , lpszValue , nUnitID );
//MFC
::SendMessage(python windows hwnd, wparam as a pointer of string message, 
              lparam as a pointer of id string.);

//PYTHON
python_string  = c_char_p(string)
//PYTHON
msg = string.split(python_string,"/")

更多信息:http://docs.python.org/library/ctypes.html。 历史 1.0:第一次上传。 本文转载于:http://www.diyabc.com/frontweb/news12187.html

原文地址:https://www.cnblogs.com/Dincat/p/13473661.html