一个简单图形界面框架XYGui的设计与实现 (一)
来源:互联网 发布:打牌赚钱的软件 编辑:程序博客网 时间:2024/05/19 14:18
(同步个人博客http://sxysxy.org/blogs/67 到csdn..)
前传
和dram神犇做了个交♂易,我来发布一些关于制作一个Gui库的教程。借用林则徐的两句名言来描述我现在的心情:(这里省略14个字)
简介
这里我以半年多前我开坑的 XYGui 为讲解的对象。XYGui是一个几乎完全使用ruby语言开发的,简洁快速的,支持opengl等高级功能的Gui框架,是我学OI颓废之时抽空制作的….
你需要准备:
windows系统,ruby 2.x(32位),devkit for ruby(ruby需要的这些东西都可以在 这里 下载到)+不怕折腾的强大内心。
先说点别的
- 为什么我要做这个gui库
受不了tk难看的界面和低下的执行效率(在windows下),受不了fxruby非native的界面与对中文不良好的支持(fxruby编码的问题好像在win和Linux上都有)…(为此甚至我都与fxruby维护者要撕起来啦(x))。希望有一个自己高度理解,掌握的gui库(这样我就能快速开发出图形界面应用)。于是我一怒之下就自己写了个(x
- 为什么选择ruby语言
除了作为我编程语言上的”母语”所带来的的特殊感情外,还有这样的原因: (就我所言) 优美的函数式编程的支持(之后泥萌将会看到,XYGui的example代码充满函数式的倾向);成熟的技术(在制作这个gui库之前,我向兰兰姐姐(泥萌说的”花姐”)学到了ruby与机器语言互相调用的姿势);想搞”大”新闻的心思(hh)
准备发车
配好环境,我们先来一发ruby调用windows api函数创建窗口的程序(注意请使用32位ruby解释器!,64位的解决办法我以后会给出)
假设你是会用一点ruby的,也会些windows api,那么复制下面的代码,到window_test.rb,执行它。代码看起来还让人觉得很麻烦呢。
require 'win32api'TITLE = "Window_Test" #窗口标题CLASS_NAME = "Window_Test_Class" #窗口类# API def callAPI(dll, procname, *arg) Win32API.new(dll, procname, arg.map{|e| e.is_a?(String)? "p":"L"}.join, "L").call *argend#preparehInstance = callAPI("kernel32", "GetModuleHandle", 0)DefProc = callAPI("kernel32", "GetProcAddress", callAPI("kernel32", "GetModuleHandle", "user32"), "DefWindowProcA")#window classwndclass = [0, DefProc, #lpfnWndProc 0, 0, hInstance, callAPI("user32", "LoadIcon", hInstance, 32512), #Icon callAPI("user32", "LoadCursor", 0, 32512), #IDC_ARROW 6, #COLOR_WINDOW_FRAME 0, CLASS_NAME].pack("LLLLLLLLLp")if callAPI("user32", "RegisterClass", wndclass) == 0 callAPI("user32", "MessageBox", 0, "Window class Error", "Error", 0) exit endhWnd = callAPI("user32", "CreateWindowEx", 0, CLASS_NAME, TITLE, 0xcf0000 | 0x10000000, #WS_OVERLAPPEDWINDOW | WS_VISIBLE 100, 100, 400, 300, 0, 0, hInstance, 0)msg = "\0"*28 #MSGwhile callAPI("user32", "GetMessage", msg, 0, 0, 0) callAPI("user32", "TranslateMessage", msg) callAPI("user32", "DispatchMessage", msg)end
不出意外的话,会出现这样一个窗口
能拖拽,缩放。但是如果你是在命令行里面启动这个脚本的话,点击窗口右上角的x,然后会发现其实脚本并没有退出,因为我们是并没有处理按下x退出这样的事件的。。。所以只是关掉了窗口,程序并没有退出。但是至少窗口出来了!
但是
显然你是不希望每次都要写那么多的,你是希望能够把它封装起来,成为Gui库。好我当然会继续讲的….
第(一)节就到这里啦
- 一个简单图形界面框架XYGui的设计与实现 (一)
- [综合] 一个简单图形界面框架XYGui的设计与实现 (二)
- 一个简单图形界面框架XYGui的设计与实现 (三)
- 一个简单图形界面框架XYGui的设计与实现 (四)
- 一个简单图形界面框架XYGui的设计与实现 (五)
- 【远程调用框架】如何实现一个简单的RPC框架(一)想法与设计
- 【远程调用框架】如何实现一个简单的RPC框架(五)优化三:软负载中心设计与实现
- 一个简单的rpc框架实现(一)
- 使用Akka实现一个简单的RPC框架(一)
- 一个脑残壳的框架设计与实现
- 数据库框架设计与实现(一)
- Java实现一个简单的RPC框架(一) 本地调用
- Android上实现一个简单的天气预报APP(一) 设计
- go实现一个简单的游戏服务器框架(lotou)基本设计
- fresco系列一 异步框架的设计与实现
- Web框架设计与实现(一):Maverick
- 一个简单的生产者与消费者的多线程例子(一):简单的框架
- 如何写一个RPC框架(一):关注点与我的实现
- csdn待改进点之42------> 为什么再次顶一下文章, 顶数会减1?
- background,表单基础知识总结
- 『sklearn练习』利用机器学习找出『冰雹猜想』中 n 和 fn 之间的关系
- 数组越界异常
- DB2命令
- 一个简单图形界面框架XYGui的设计与实现 (一)
- [转载]影像分辨率、地面分辨率、比例尺及DPI之间的关系
- 数组元素的插入和删除
- graphviz在ubuntu下安装使用简单备忘
- Material Design——Touch feedback Ripple波纹动画
- [心得]Tsung压测工具科普
- 浮动及其特性,怎样清除浮动
- 2016.11.26随记
- 2016-11-26 C++琐碎学习整理