一个简单图形界面框架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库。好我当然会继续讲的….

第(一)节就到这里啦

0 0