(同步个人博客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 *arg
end
#prepare
hInstance = callAPI("kernel32", "GetModuleHandle", 0)
DefProc = callAPI("kernel32", "GetProcAddress", callAPI("kernel32", "GetModuleHandle", "user32"), "DefWindowProcA")
#window class
wndclass = [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
end
hWnd = callAPI("user32", "CreateWindowEx", 0, CLASS_NAME, TITLE,
0xcf0000 | 0x10000000, #WS_OVERLAPPEDWINDOW | WS_VISIBLE
100, 100, 400, 300, 0, 0, hInstance, 0)
msg = "\0"*28 #MSG
while callAPI("user32", "GetMessage", msg, 0, 0, 0)
callAPI("user32", "TranslateMessage", msg)
callAPI("user32", "DispatchMessage", msg)
end
不出意外的话,会出现这样一个窗口
能拖拽,缩放。但是如果你是在命令行里面启动这个脚本的话,点击窗口右上角的x,然后会发现其实脚本并没有退出,因为我们是并没有处理按下x退出这样的事件的。。。所以只是关掉了窗口,程序并没有退出。但是至少窗口出来了!
但是
显然你是不希望每次都要写那么多的,你是希望能够把它封装起来,成为Gui库。好我当然会继续讲的….
第(一)节就到这里啦